求调treap40pts
查看原帖
求调treap40pts
91433
czy0407楼主2024/4/9 20:33
#include<bits/stdc++.h>
#define ll long long
#define ls(u) tr[u].s[0]
#define rs(u) tr[u].s[1]
using namespace std;
const int N=1e5+10,INF=1e8;
ll n,rt,cnt,op=-1,num,ans;
struct tree
{
	ll s[2],val,pri;
}tr[N];
void rote(ll &u,ll op)
{
	ll t=tr[u].s[!op];
	tr[u].s[!op]=tr[t].s[op];
	tr[t].s[op]=u;
	u=t;
	return;
}
void ins(ll &u,ll x)
{
	if(!u)
	{
		u=++cnt;
		tr[u].val=x;
		tr[u].pri=rand();
		return;
	}
	if(x<tr[u].val)
	{
		ins(ls(u),x);
		if(tr[ls(u)].pri<tr[u].pri)rote(u,1);
	}
	else
	{
		ins(rs(u),x);
		if(tr[rs(u)].pri<tr[u].pri)rote(u,0);
	}
}
ll del(ll &u,ll x)
{
	ll v=0;
	if(x==tr[u].val||x<tr[u].val&&!ls(u)||x>tr[u].val&&!rs(u))
	{
		v=tr[u].val;
		if(!ls(u)||!rs(u))
		{
			u=ls(u)+rs(u);
			return v;
		}
	}
	if(x<tr[u].val)v=del(ls(u),x);
	else v=del(rs(u),x);
	return v;
}
ll pre(ll u,ll x)
{
	if(!u)return -INF;
	if(x<=tr[u].val)return pre(ls(u),x);
	return max(pre(rs(u),x),tr[u].val);
}
ll nxt(ll u,ll x)
{
	if(!u)return INF;
	if(x>=tr[u].val)return nxt(ls(u),x);
	return min(nxt(rs(u),x),tr[u].val);
}

int main()
{
	ios::sync_with_stdio(0);
	srand(time(0));
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		ll k,x;
		cin>>k>>x;
		if(op!=!k)op=k,ins(rt,x),num++;
		else
		{
			int l=pre(rt,x+1),r=nxt(rt,x-1);
			int L=abs(l-x),R=abs(r-x);
			if(L==R)ans+=L,del(rt,l);
			if(L<R)ans+=L,del(rt,l);
			if(L>R)ans+=R,del(rt,r);
			num--;
			if(num==0)op=-1;
		}
		ans%=1000000;
	}
	cout<<ans;
	return 0;
}

2024/4/9 20:33
加载中...