fhq treap 20pts求调教(悬1关
查看原帖
fhq treap 20pts求调教(悬1关
754502
_AyachiNene楼主2023/7/20 11:39
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1000000;
struct node
{
	int l,r,val,rnd,size;
}t[3][114514];
int root[3],cnt[3];
void update(int p,int id)
{
	t[id][p].size=t[id][t[id][p].l].size+t[id][t[id][p].r].size+1;
}
int New(int x,int id)
{
	t[id][++cnt[id]].val=x;
	t[id][cnt[id]].rnd=rand();
	t[id][cnt[id]].size=1;
	return cnt[id];
}
void split(int p,int val,int &x,int &y,int id)
{
	if(!p)
		x=y=0;
	else
	{
		if(t[id][p].val<=val)
		{
			x=p;
			split(t[id][p].r,val,t[id][p].r,y,id);
		}
		else
		{
			y=p;
			split(t[id][p].l,val,x,t[id][p].l,id);
		}
		update(p,id);
	}
}
int merge(int x,int y,int id)
{
	if(!x||!y)
		return x|y;
	if(t[id][x].rnd<=t[id][y].rnd)
	{
		t[id][x].r=merge(t[id][x].r,y,id);
		update(x,id);
		return x;
	}
	else
	{
		t[id][y].l=merge(x,t[id][y].l,id);
		update(y,id);
		return y;
	}
}
void insert(int x,int id)
{
	int a,b;
	split(root[id],x,a,b,id);
	root[id]=merge(merge(a,New(x,id),id),b,id);
}
void del(int x,int id)
{
	int a,b,c;
	split(root[id],x,b,c,id);
	split(b,x-1,a,b,id);
	root[id]=merge(merge(a,merge(t[id][b].l,t[id][b].r,id),id),c,id);
}
int pre(int x,int id)
{
	int a,b;
	split(root[id],x-1,a,b,id);
	int ans,p=a;
	while(p)
		ans=t[id][p].val,p=t[id][p].r;
	root[id]=merge(a,b,id);
	return ans;
}
int nxt(int x,int id)
{
	int a,b;
	split(root[id],x,a,b,id);
	int ans,p=b;
	while(p)
		ans=t[id][p].val,p=t[id][p].l;
	root[id]=merge(a,b,id);
	return ans;
}
int n;
int tot,tot1;
int ans;
signed main()
{
	cin>>n;
	while(n--)
	{
		int op,x;
		cin>>op>>x;
		if(op==0)
		{
			if(!tot)
				insert(x,1),++tot1;
			else
			{
				int nx=nxt(x,2);
				int pr=pre(x,2);
				if(abs(x-pr)>=abs(x-nx))
					del(pr,2),ans=(ans+abs(x-pr))%mod;
				else
					del(nx,2),ans=(ans+abs(x-nx))%mod;
				--tot;
			}
		}
		else
		{
			if(!tot1)
				insert(x,2),++tot;
			else
			{
				int nx=nxt(x,1);
				int pr=pre(x,1);
				if(abs(x-pr)>=abs(x-nx))
					del(pr,1),ans=(ans+abs(x-pr))%mod;
				else
					del(nx,1),ans=(ans+abs(x-nx))%mod;
				--tot1;
			}
		}
	}
	cout<<ans;
}
2023/7/20 11:39
加载中...