旋转Treap 58分
查看原帖
旋转Treap 58分
744789
Big_Bishop楼主2023/12/2 16:05
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
struct node{
	int ls,rs,val,p,same,sz;
}tree[100005];
int cnt;
void updata(int u){
	tree[u].sz=tree[tree[u].ls].sz+tree[tree[u].rs].sz+tree[u].same;
}
int left(int u){
	int id=tree[u].rs;
	tree[u].rs=tree[id].ls;
	tree[id].ls=u;
	tree[id].sz=tree[u].sz;
	updata(u);
	return id;
}
int right(int u){
	int id=tree[u].ls;
	tree[u].ls=tree[id].rs;
	tree[id].rs=u;
	tree[id].sz=tree[u].sz;
	updata(u);
	return id;
}
int insert(int u,int val){
	if(u==0){
		cnt++;
		tree[cnt].ls=tree[cnt].rs=0;
		tree[cnt].p=rand();
		tree[cnt].same=tree[cnt].sz=1;
		tree[cnt].val=val;
		return cnt;
	}
	if(tree[u].val==val){
		tree[u].same++;
		tree[u].sz++;
		return u;
	}
	else if(tree[u].val>val){
		tree[u].ls=insert(tree[u].ls,val);
		tree[u].sz++;
		if(tree[u].p>tree[tree[u].ls].p){
			int o=right(u);
			return o;
		}
	}
	else{
		tree[u].rs=insert(tree[u].rs,val);
		tree[u].sz++;
		if(tree[u].p>tree[tree[u].rs].p){
			int o=left(u);
			return o;
		}
	}
	return u;
}
int del(int u,int val){
	if(tree[u].val==val){
		tree[u].same--;
		tree[u].sz--;
		if(tree[u].same==0){
			if(tree[u].ls==0||tree[u].rs==0){
				return tree[u].ls+tree[u].rs;
			}
			if(tree[tree[u].ls].p<tree[tree[u].rs].p){//把左儿子转上来 
				int id=right(u);
				tree[id].rs=del(tree[id].rs,val);
				return id;
			}
			else{
				int id=left(u);
				tree[id].ls=del(tree[id].ls,val);
				return id;
			}
		}
		else{
			return u;
		}
	}
	else if(tree[u].val<val){
		tree[u].sz--;
		tree[u].rs=del(tree[u].rs,val);
		return u;
	}
	else{
		tree[u].sz--;
		tree[u].ls=del(tree[u].ls,val);
		return u;
	}
}
int pai(int u,int val){
	if(u==0) return 0;
	if(tree[u].val==val) return tree[tree[u].ls].sz;
	else if(tree[u].val>val){
		return pai(tree[u].ls,val);
	}
	else{
		return pai(tree[u].rs,val)+tree[u].same+tree[tree[u].ls].sz;
	}
}
int ans=0;
void qian(int u,int val){
	if(u==0) return;
	if(tree[u].val<val){
		ans=tree[u].val;
		qian(tree[u].rs,val);
	}
	else{
		qian(tree[u].ls,val);
	}
}
void hou(int u,int val){
	if(u==0) return;
	if(tree[u].val>val){
		ans=tree[u].val;
		hou(tree[u].ls,val);
	}
	else{
		hou(tree[u].rs,val);
	}
}
int check(int u,int val){
	if(u==0) return 0;
	if(tree[tree[u].ls].sz>=val){
		return check(tree[u].ls,val);
	}
	else if(tree[tree[u].ls].sz+tree[u].same>=val){
		return tree[u].val;
	}
	else return check(tree[u].rs,val-(tree[tree[u].ls].sz+tree[u].same));
}
int root=0;
int main(){
//	freopen("asd.txt","r",stdin);
	srand(time(0));
	int _;
	scanf("%d",&_);
	while(_--){
		int o,x;
		scanf("%d%d",&o,&x);
		if(o==1){
			root=insert(root,x);
		}
		else if(o==2){
			root=del(root,x);
		}
		else if(o==3){
			printf("%d\n",pai(root,x)+1);
		}
		else if(o==4){
			printf("%d\n",check(root,x)); 
		}
		else if(o==5){
			ans=0;
			qian(root,x);
			printf("%d\n",ans);
		}
		else{
			ans=0;
			hou(root,x);
			printf("%d\n",ans);
		}
	}
	return 0; 
} 
2023/12/2 16:05
加载中...