fhq90求调玄关
查看原帖
fhq90求调玄关
1412072
xffxxxf楼主2024/11/26 20:54
#include<bits/stdc++.h>
#define inf 2147483647
using namespace std;
struct fhq{
#define maxn 80005
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
	struct edge{
	int val,siz,ls,rs,key;
    }tr[maxn];
	int cnt=0,x,y,rt;
	int newnode(int val){
		tr[++cnt].key=rand();
		tr[cnt].val=val;
		tr[cnt].siz=1;
		return cnt;
	}
	void pushup(int now){
    	tr[now].siz=tr[ls(now)].siz+tr[rs(now)].siz+1;
	}
	void split(int now,int val,int &x,int &y){
		if(!now){
			x=y=0;
			return;
		}
		if(tr[now].val<=val){
			x=now;
			split(rs(now),val,rs(now),y);
		}
		else{
			y=now;
			split(ls(now),val,x,ls(now));
		}
		pushup(now);
    }
	int merge(int xx,int yy){
		if(!xx||!yy)return xx^yy;
		if(tr[xx].key<tr[yy].key){
			rs(xx)=merge(rs(xx),yy);
			pushup(xx);
			return xx;
		}
		else{
			ls(yy)=merge(xx,ls(yy));
			pushup(yy);
			return yy;
		}
	}
	void add(int val){
		split(rt,val,x,y);
		rt=merge(merge(x,newnode(val)),y);
	}
	void de(int val){
		split(rt,val,x,y);
		int z;
		split(x,val-1,x,z);
		z=merge(ls(z),rs(z));
		rt=merge(merge(x,z),y);
	}
	int getf(int val){
		split(rt,val-1,x,y);
		int now=x;
		while(rs(now))now=rs(now);
		rt=merge(x,y);
		return tr[now].val;
	}
	int getb(int val){
		split(rt,val,x,y);
		int now=y;
		while(ls(now))now=ls(now);
		rt=merge(x,y);
		return tr[now].val;
	}
	void build(){
		add(inf);
		add(-inf); 
	}
	int sizee(){
		return tr[rt].siz-2;
	}
}mas,pe;
int main(){
	int n,ans=0;
	scanf("%d",&n);
	mas.build();
	pe.build();
	for(int i=1;i<=n;i++){
		int op,val;
		scanf("%d%d",&op,&val);
		if(op){
			if(mas.sizee()<pe.sizee()){
			     int fr=pe.getf(val+1),ba=pe.getb(val-1);
			     if(abs(val-fr)>abs(val-ba)){
			     	pe.de(ba);
			     	ans+=ba-val;
				 }
				 else{
				 	pe.de(fr);
				 	ans+=val-fr;
				 }
			}
			else mas.add(val);
		}
		else{
			if(pe.sizee()<mas.sizee()){
				int fr=mas.getf(val),ba=mas.getb(val);
				if(abs(val-fr)>abs(val-ba)){
					mas.de(ba);
					ans+=ba-val;
				}
				else{
					mas.de(fr);
					ans+=val-fr;
				}
			}
			else pe.add(val);
		}
		ans%=1000000;
	}
	printf("%d",ans);
	return 0;
} 
2024/11/26 20:54
加载中...