FHQTreap WA40pts on #1,#3,#6~#9求调
查看原帖
FHQTreap WA40pts on #1,#3,#6~#9求调
477821
toolong114514楼主2024/1/18 20:34
#include<iostream>
#include<cstdlib>
using namespace std;
#define int long long
const int INF=0x3f3f3f3f3f3f3f3f;
const int N=1e6+10;
const int mod=1000000;
struct node{
	int lson,rson,val,pri,kd;
}treap1[N],treap2[N];
int cnt,root1,root2;
int build1(int x){
	treap1[++cnt].val=x;
	treap1[cnt].pri=rand();
	return cnt;
}
void split1(int pos,int x,int &l,int &r){
	if(!pos){
		l=r=0;
		return;
	}
	if(treap1[pos].val<=x){
		l=pos;
		split1(treap1[pos].rson,x,treap1[pos].rson,r);
	}else{
		r=pos;
		split1(treap1[pos].lson,x,l,treap1[pos].lson);
	}
}
int mgr1(int l,int r){
	if(!l||!r) return l+r;
	if(treap1[l].pri<=treap1[r].pri){
		treap1[l].rson=mgr1(treap1[l].rson,r);
		return l;
	}else{
		treap1[r].lson=mgr1(l,treap1[r].lson);
		return r;
	}
}
int get_max1(int pos){
	if(!pos) return -INF; 
	if(treap1[pos].rson) return get_max1(treap1[pos].rson);
	else return max(get_max1(treap1[pos].lson),treap1[pos].val);
}
int get_min1(int pos){
	if(!pos) return INF;
	if(treap1[pos].rson) return get_min1(treap1[pos].rson);
	else return min(get_min1(treap1[pos].lson),treap1[pos].val);
}
//人 
int build2(int x){
	treap2[++cnt].val=x;
	treap2[cnt].pri=rand();
	return cnt;
}
void split2(int pos,int x,int &l,int &r){
	if(!pos){
		l=r=0;
		return;
	}
	if(treap2[pos].val<=x){
		l=pos;
		split2(treap2[pos].rson,x,treap2[pos].rson,r);
	}else{
		r=pos;
		split2(treap2[pos].lson,x,l,treap2[pos].lson);
	}
}
int mgr2(int l,int r){
	if(!l||!r) return l+r;
	if(treap2[l].pri<=treap2[r].pri){
		treap2[l].rson=mgr2(treap2[l].rson,r);
		return l;
	}else{
		treap2[r].lson=mgr2(l,treap2[r].lson);
		return r;
	}
}
int get_max2(int pos){
	if(!pos) return -INF; 
	if(treap2[pos].rson) return get_max2(treap2[pos].rson);
	else return max(get_max2(treap2[pos].lson),treap2[pos].val);
}
int get_min2(int pos){
	if(!pos) return INF;
	if(treap2[pos].rson) return get_min2(treap2[pos].rson);
	else return min(get_min2(treap2[pos].lson),treap2[pos].val);
}

void ins1(int x){
	int ll,rr;
	split1(root1,x-1,ll,rr);
	root1=mgr1(mgr1(ll,build1(x)),rr);
}
void ins2(int x){
	int ll,rr;
	split2(root2,x-1,ll,rr);
	root2=mgr2(mgr2(ll,build2(x)),rr);
}
int n,ans;
signed main(){
	ios::sync_with_stdio(false);
	cin>>n;
	while(n--){
		int a,b;
		cin>>a>>b;
		if(a==0){
			if(!root2){
				ins1(b);
			}else{
				int ll,rr;
				split2(root2,b,ll,rr);
				int t1=get_max2(ll),t2=get_min2(rr),t;
				if(t1==-INF&&t2==INF) continue;
				if(t2-b>=b-t1){
					ans+=b-t1;
					split2(ll,t1-1,ll,t);
					root2=mgr2(ll,rr);
				}else{
					ans+=t2-b;
					split2(rr,t2,t,rr);
					root2=mgr2(ll,rr);
				}
				ans%=mod;
			}
		}else{
			if(!root1){
				ins2(b);
			}else{
				int ll,rr;
				split1(root1,b,ll,rr);
				int t1=get_max1(ll),t2=get_min1(rr),t;
				if(t1==-INF&&t2==INF) continue;
				if(t2-b>=b-t1){
					ans+=b-t1;
					split1(ll,t1-1,ll,t);
					root1=mgr1(ll,rr);
				}else{
					ans+=t2-b;
					split1(rr,t2,t,rr);
					root1=mgr1(ll,rr);
				}
				ans%=mod;
			}
		}
 	}
	cout<<ans;
	return 0;
}
2024/1/18 20:34
加载中...