求助Splay
查看原帖
求助Splay
285617
黑影洞人楼主2022/6/29 22:06

验证码rtwa祭

#include<cstdio>
#include<algorithm>
#define N 114514
#define inf 2147483647
using namespace std;
//Whindsers2022.6.29
struct Splay{
	int f[N],size[N],chi[N][2],sum[N],val[N],root=0,cnt=0;
	int son(int x){return chi[f[x]][1]==x;}
	void update(int x){size[x]=size[chi[x][0]]+size[chi[x][1]]+sum[x];}
	void connect(int x,int y,int son){f[x]=y,chi[y][son]=x;}
	void rotate(int x){
		int y=f[x],z=f[y],k=son(x),v=chi[x][!k];
		connect(v,y,k),connect(x,z,son(y)),connect(y,x,!k);
		update(y),update(x);
	}
	void splay(int x){for(int y;y=f[x];rotate(x))if(f[y])rotate(son(x)!=son(y)?x:y);root=x;}
	int find(int x){//查找权值为x的结点 
		for(int p=root;p;p=chi[p][x>val[p]])if(x==val[p]){splay(p);return p;}
		return -1;
	} 
	int rank(int x){return size[chi[find(x)][0]]+1;}
	int kth(int k){
		int p=root;
		while(p){
			if(k==size[chi[p][0]]+1)return val[p];
			if(k<=size[chi[p][0]])p=chi[p][0];
			else k-=size[chi[p][0]]+1,p=chi[p][1];
		}
		return inf;
	} 
	int newnode(int x){val[++cnt]=x,size[cnt]=sum[cnt]=1;return cnt;}
	void insert(int x){
		if(!root)return void(root=newnode(x));int k=0;
		for(int p=root;p;p=chi[p][x>val[p]]){
			k=p;
			if(x==val[p])return void(++sum[p]);
		}
		connect(newnode(x),k,x>val[k]);
		splay(cnt);
	}
	void del(int x){
		int p=find(x);
		if(p==-1)return;
		if(sum[p]>1)return void(--sum[p]);
		p=chi[p][0];while(chi[p][1])p=chi[p][1];
		splay(p);
		connect(chi[chi[p][1]][1],p,1);
		update(p);
	}
	int prev(int x){
		insert(x);
		int p=chi[root][0];
		while(chi[p][1])p=chi[p][1];
		int ans=val[p];del(x);
		return ans;
	}
	int next(int x){
		insert(x);
		int p=chi[root][1];
		while(chi[p][0])p=chi[p][0];
		int ans=val[p];del(x);
		return ans;
	}
}Fifi;
int n; 
signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int op,x;
		scanf("%d%d",&op,&x);
		if(op==1)Fifi.insert(x);
		if(op==2)Fifi.del(x);
		if(op==3)printf("%d\n",Fifi.rank(x));
		if(op==4)printf("%d\n",Fifi.kth(x));
		if(op==5)printf("%d\n",Fifi.prev(x));
		if(op==6)printf("%d\n",Fifi.next(x));
	}
	return 0;
}



2022/6/29 22:06
加载中...