Mnzn 旋转Treap 20pts求调
查看原帖
Mnzn 旋转Treap 20pts求调
933802
ICU152_lowa_IS8楼主2024/8/21 01:37
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int val[1000005],cnt[1000005],siz[1000005],dat[1000005],ch[1000005][2];
int tot,root;
int New(int v){
	val[++tot]=v;
	cnt[tot]=1;
	siz[tot]=1;
	dat[tot]=rand();
	return tot;
}
void pushup(int id){
	siz[id]=siz[ch[id][0]]+siz[ch[id][1]]+cnt[id];
}
void Rotate(int &id,int d){
	int temp=ch[id][d^1];
	ch[id][d^1]=ch[temp][d];
	ch[temp][d]=id;
	id=temp;
	pushup(ch[id][d]);
	pushup(id);
}
void build(){
	root=New(-0x3f3f3f3f3f3f3f3f);
	ch[root][1]=New(0x3f3f3f3f3f3f3f3f);
	pushup(root);
}
void insert(int &id,int v){
	if(!id){
		id=New(v);
		return;
	}
	if(v==val[id]){
		cnt[id]++;
	}
	else{
		int d=v<val[id]?0:1;
		insert(ch[id][d],v);
		if(dat[id]<dat[ch[id][d]])Rotate(id,d^1);
	}
	pushup(id);
}
void del(int &id,int v){
//	cout<<id<<"-"<<v<<endl;
	if(!id)return;
	if(v==val[id]){
		if(cnt[id]>1){
			cnt[id]--;
		}
		else if(ch[id][0]||ch[id][1]){
			if(!ch[id][1]||dat[ch[id][0]]>dat[ch[id][1]]){
				Rotate(id,1);
				del(ch[id][1],v);
			}
			else{
				Rotate(id,0);
				del(ch[id][0],v);
			}
		}
		else{
			id=0;
			return;
		}
	}
	else{
		int d=v<val[id]?0:1;
		del(ch[id][d],v);
	}
	pushup(id);
}
int getpre(int v){
	int id=root,ans=0;
	while(id){
		if(val[id]==v){
			return val[id];
		}
		else if(val[id]<v){
			ans=val[id];
			id=ch[id][1];
		}
		else{
			id=ch[id][0];
		}
	}
	return ans;
}
int getnext(int v){
	int id=root,ans=0;
	while(id){
		if(val[id]==v){
			return val[id];
		}
		else if(val[id]<v){
			id=ch[id][1];
		}
		else{
			ans=val[id];
			id=ch[id][0];
		}
	}
	return ans;
}
signed main(){
	srand(time(NULL));
	cin>>n;
	build();
	int cnt=0,ans=0;
	for(int i=1;i<=n;i++){
		int a,b;
		cin>>a>>b;
		if(a==0){
			cnt++;
			insert(root,b);
		}
		else{
//			cout<<"_____________________________\n";
			if(cnt==0)continue;
			cnt--;
			int pre=getpre(b),nxt=getnext(b);
			if(abs(b-pre)<=abs(nxt-b)){
				ans+=abs(b-pre);
				ans%=1000000;
				del(root,pre);
			}
			else{
				ans+=abs(nxt-b);
				ans%=1000000;
				del(root,nxt);
			}
//			cout<<getpre(b)<<"||"<<getnext(b)<<endl;
		}
	} 
	cout<<ans%1000000;
	return 0;
}

2024/8/21 01:37
加载中...