fhqtreap10分求调,悬赏三关
查看原帖
fhqtreap10分求调,悬赏三关
940678
lhrfc楼主2023/6/7 11:04
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10,MOD=1000000,inf=0x33f3f3f;
class fhqtql{
public:
	struct node{
		int ls,rs;
		int x,rnd,size;
	}tr[N];
	int tot=0,root=0;
	int newNode(int x){
		tr[++tot]={0,0,x,rand(),1};
		return tot;
	}
	inline void pushuup(int x){
		tr[x].size=tr[tr[x].ls].size+tr[tr[x].rs].size+1;
	}
	void split(int u,int &x,int &y,int val){
		if(!u){
			x=0,y=0;
			return;
		}
		if(tr[u].x<=val){
			x=u;
			split(tr[x].rs,tr[x].rs,y,val);
		}
		else{
			y=u;
			split(tr[y].ls,x,tr[y].ls,val);
		}
		pushuup(u);
	}
	int merge(int x,int y){
		if(!x||!y) return x+y;
		if(tr[x].rnd<tr[y].rnd){
			tr[x].rs=merge(tr[x].rs,y);
			pushuup(x);
			return x;
		}
		else{
			tr[y].ls=merge(x,tr[y].ls);
			pushuup(y);
			return y;
		}
	}
	void insert(int x){
		int l,r;
		split(root,l,r,x);
		root=merge(l,merge(newNode(x),r));
	}
	void del(int x){
		int l,r,xx,yy;
		split(root,l,r,x);
		split(l,xx,yy,x-1);
		yy=merge(tr[yy].ls,tr[yy].rs);
		root=merge(merge(xx,yy),r);
	}
	int kth(int u,int k){
		int p=tr[tr[u].ls].size+1;
		if(p==k) return tr[u].x;
		if(p>k) return kth(tr[u].ls,k);
		return kth(tr[u].rs,k-p);
	}
	int getPre(int x){
		int l,r;
		split(root,l,r,x);
		int tmp=kth(l,tr[l].size);
		root=merge(l,r);
		return tmp;
	}
	int getNxt(int x){
		int l,r;
		split(root,l,r,x-1);
		int tmp=kth(r,1);
		root=merge(l,r);
		return tmp;
	}
	int size(){
		return tr[root].size;
	}
	fhqtql(){
		insert(inf),insert(-inf);
	}
};
fhqtql pet,man;
int n,ans=0;
int  main(){
	cin>>n;
	while(n--){
		int a,b;
		cin>>a>>b;
		if(a==0){
			if(pet.size()>man.size()){
				pet.insert(b);
			}
			else{
				int x=man.getNxt(b),y=man.getPre(b);
				if(abs(x-b)<abs(y-b)&&x!=inf){
					man.del(x);
					ans+=abs(x-b);
				}
				else if(y!=-inf){
					man.del(y);
					ans+=abs(y-b);
				}
				ans%=MOD;
			}
		}
		else{
			if(pet.size()<man.size()) man.insert(b);
			else{
				int x=pet.getNxt(b),y=pet.getPre(b);
				if(abs(x-b)<abs(y-b)&&x!=inf){
					pet.del(x);
					ans+=abs(x-b);
				}
				else if(y!=-inf){
					pet.del(y);
					ans+=abs(y-b);
				}
				ans%=MOD;				
			}
		}
	}
	cout<<ans;
}
2023/6/7 11:04
加载中...