Treap树90分 WA点3求助
查看原帖
Treap树90分 WA点3求助
469622
yokai_ing楼主2022/12/6 07:27
#include<bits/stdc++.h>
using namespace std;
#define MAXN 80010
#define MOD 1000000
#define int long long
struct node{
	int lc,rc;
	int val,num;
	int pri;
}tree[MAXN];
int n,opt,x,cnt,root,sum1,sum2,k,ans;
int New(int val)
{
	int now=++cnt;
	tree[now].lc=tree[now].rc=0;
	tree[now].pri=rand();
	tree[now].num=1;
	tree[now].val=val;
	return now;
}
void zig(int &p)
{
	int q=tree[p].lc;
	tree[p].lc=tree[q].rc;
	tree[q].rc=p;
	p=q;
}
void zag(int &p)
{
	int q=tree[p].rc;
	tree[p].rc=tree[q].lc;
	tree[q].lc=p;
	p=q;
}
void Insert(int &p,int val)
{
	if(!p){
		p=New(val);
		return;
	}
	if(tree[p].val==val)
	    tree[p].num++;
	else if(tree[p].val>val){
		Insert(tree[p].lc,val);
		if(tree[tree[p].lc].pri>tree[p].pri)
		    zig(p);
	}else{
		Insert(tree[p].rc,val);
		if(tree[tree[p].rc].pri>tree[p].pri)
		    zag(p);
	}
	return;
}
void Delete(int &p,int val)
{
	if(!p)return;
	if(tree[p].val==val){
		tree[p].num--;
		if(tree[p].num<=0)
		{
			if(!tree[p].lc||!tree[p].rc)
			    p=tree[p].lc+tree[p].rc;
			else if(tree[tree[p].lc].pri>tree[tree[p].rc].pri){
				zig(p);
				Delete(tree[p].lc,val);
			}else{
				zag(p);
				Delete(tree[p].rc,val);
			}
		}
	}else if(tree[p].val>val){
		Delete(tree[p].lc,val);
	}else{
		Delete(tree[p].rc,val);
	}
	return;
}
int find_pre(int val)
{
	int p=root,ans=-1e18;
	do{
		if(tree[p].val<val){
			ans=tree[p].val;
			p=tree[p].rc;
		}else{
			p=tree[p].lc;
		}
	}while(p);
	return ans;
}
int find_Nxt(int val)
{
	int p=root,ans=1e18;
	do{
		if(tree[p].val>val){
			ans=tree[p].val;
			p=tree[p].lc;
		}else{
			p=tree[p].rc;
		}
	}while(p);
	return ans;
}
signed main(){
	srand(time(0));
	cin>>n;
	root=0;
	for(int i=1;i<=n;i++)
	{
		cin>>opt>>x;
		if(opt==0){
			sum1++;
			if(sum1<=sum2){
				int l=find_pre(x);
				int r=find_Nxt(x);
				if(r-x<x-l||l==-1e18){
					ans=(ans+(r-x)%MOD)%MOD;
					Delete(root,r);
				}else{
					ans=(ans+(x-l)%MOD)%MOD;
					Delete(root,l);
				}
			}else{
				Insert(root,x);
			}
		}else{
			sum2++;
			if(sum2<=sum1){
				int l=find_pre(x);
				int r=find_Nxt(x);
				if(r-x<x-l||l==-1e18){
					ans=(ans+(r-x)%MOD)%MOD;
					Delete(root,r);
				}else{
					ans=(ans+(x-l)%MOD)%MOD;
					Delete(root,l);
				}
			}else{
				Insert(root,x);
			}
		}
	}
	cout<<ans<<"\n";
	return 0;
}
2022/12/6 07:27
加载中...