splay 72pts WA on#9#10#11#12求调 玄关
查看原帖
splay 72pts WA on#9#10#11#12求调 玄关
556975
PNNNN楼主2024/3/29 20:32
#include<bits/stdc++.h>
#define int long long
#define ls son[k][0]
#define rs son[k][1]
using namespace std;

int n;

int val[500005],siz[500005],fa[500005],son[500005][2],cnt,rt;

inline bool check(int k){
	return son[fa[k]][1]==k;
}

inline void pushup(int k){
	siz[k]=siz[ls]+siz[rs]+1;return;
}

inline void clear(int k){
	siz[k]=ls=rs=fa[k]=val[k]=0;return;
}

inline void rotate(int x){//将x向上旋转 
	int y=fa[x];
	son[fa[y]][check(y)]=x;
	if(!check(x)){//x为y的ls
		son[y][0]=son[x][1],son[x][1]=y;
		fa[x]=fa[y],fa[y]=x,fa[son[y][0]]=y;
		pushup(y),pushup(x);
	}else{        //x为y的rs
		son[y][1]=son[x][0],son[x][0]=y;
		fa[x]=fa[y],fa[y]=x,fa[son[y][1]]=y;
		pushup(y),pushup(x);
	}return;
}

inline void splay(int x,int top){
	while(fa[x]!=top){
		int y=fa[x];
		if(fa[y]!=top){
			if(check(x)==check(y)){
				rotate(y);
			}else rotate(x);
		}rotate(x);
	}if(!top)rt=x;return;
}

inline void insert(int P,int &k,int last){
	if(!k){
		k=++cnt,siz[k]=1;
		val[k]=P,fa[k]=last;
		splay(k,0);	
	}else{
		insert(P,son[k][P>val[k]],k);
	}return;
}

inline void find(int P,int k){
	if(!k)return;
	if(P==val[k]){
		splay(k,0);
	}else{
		if(!son[k][P>val[k]])splay(k,0);
		else find(P,son[k][P>val[k]]);
	}return;
}

inline int pre(int P){
	find(P,rt);int x=rt;
	if(val[x]<P)return x;
	x=son[x][0];
	while(son[x][1])x=son[x][1];
	return x;
}

inline int nxt(int P){
	find(P,rt);int x=rt;
	if(val[x]>P)return x;
	x=son[x][1];
	while(son[x][0])x=son[x][0];
	return x;
}

inline void delet(int P){
	int pr=pre(P),nx=nxt(P);
	splay(pr,0),splay(nx,pr);
	son[nx][0]=0,pushup(nx);
	splay(nx,0);return;
}

inline int query_rank(int P,int k){
	if(!k)return 0;
	if(val[k]<=P){
		return siz[ls]+1+query_rank(P,rs);
	}else{
		return query_rank(P,ls);
	}
}

inline int query_val(int rank,int k){
	if(siz[ls]+1==rank){
		return k;
	}if(siz[ls]+1>rank){
		return query_val(rank,ls);
	}else{
		return query_val(rank-siz[ls]-1,rs);
	}
}

inline int read(){
	register int x(0),t(0);
	static char ch=getchar();
	while(!isdigit(ch)){t|=(ch=='-');ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return t?-x:x;
}

signed main(){
	n=read(),insert(2e18,rt,0),insert(-2e18,rt,0);
	while(n--){
		int opt=read(),x=read();
		if(opt==1)insert(x,rt,0);
		else if(opt==2)delet(x);
		else if(opt==3){
			find(x-1,rt);
			cout<<query_rank(x-1,rt)<<'\n';
		}else if(opt==4){
			int res=query_val(x+1,rt);
			splay(res,0),cout<<val[res]<<'\n';
		}else if(opt==5){
			int res=pre(x);
			splay(res,0),cout<<val[res]<<'\n';
		}else if(opt==6){
			int res=nxt(x);
			splay(res,0),cout<<val[res]<<'\n';
		}
	}
	return 0;
}
2024/3/29 20:32
加载中...