why?(旋转TREAP WAon#5~#12)
查看原帖
why?(旋转TREAP WAon#5~#12)
1329138
luogu_hezhenmin1楼主2025/2/6 18:11
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int MAX=1e9;
int n,root,cnt=0; 
struct node{
	int ls,rs,key,pri,size;
}t[N];
mt19937_64 rng(time(0));
void newnode(int x){
	t[++cnt].size=1;
	t[cnt].ls=t[cnt].rs=0;
	t[cnt].key=x;
	t[cnt].pri=rng()%MAX+1;
}
void update(int u){
	t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}
void rotate(int &o,int d){
	int k=1;
	if(d==1){
		k=t[o].rs;
		t[o].rs=t[k].ls;
		t[k].ls=o;
	}
	else{
		k=t[o].ls;
		t[o].ls=t[k].rs;
		t[k].rs=o;
	}
	t[k].size=t[o].size;
	update(o);
	o=k;
} 
void insert(int &u,int x){
	if(u==0){newnode(x);u=cnt;return;}
	t[u].size++;
	if(x>=t[u].key) insert(t[u].rs,x);
	else insert(t[u].ls,x);
	if(t[u].ls!=0 and t[u].pri>t[t[u].ls].pri) rotate(u,0);
	if(t[u].rs!=0 and t[u].pri>t[t[u].rs].pri) rotate(u,1);
	update(u);
}
void del(int &u,int x){	
	t[u].size--;
	if(t[u].key==x){
		if(t[u].ls==0 and t[u].rs==0){u=0;return;}
		if(t[u].ls==0 or t[u].rs==0){u=t[u].ls+t[u].rs;return;}
		if(t[t[u].ls].pri<t[t[u].rs].pri){rotate(u,0);del(t[u].rs,x);return;}
		else{rotate(u,1);del(t[u].ls,x);return;}
	}
	if(t[u].key>=x) del(t[u].ls,x);
	else del(t[u].rs,x);
	update(u);
}
int Rank(int u,int x){
	if(u==0) return 0;
	if(x>t[u].key) return t[t[u].ls].size+1+Rank(t[u].rs,x);
	return Rank(t[u].ls,x);
}
int kth(int u,int k){
	if(k==t[t[u].ls].size+1) return t[u].key;
	if(k>t[t[u].ls].size+1) return kth(t[u].ls,k-t[t[u].ls].size-1);
	return kth(t[u].ls,k);
}
int pre(int u,int x){
	if(u==0) return 0;
	if(t[u].key>=x) return pre(t[u].ls,x);
	int tmp=pre(t[u].rs,x);
	if(tmp==0) return t[u].key;
	return tmp;
}
int suc(int u,int x){
	if(u==0) return 0;
	if(t[u].key<=x) return suc(t[u].rs,x);
	int tmp=suc(t[u].ls,x);
	if(tmp==0) return t[u].key;
	return tmp;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	while(n--){
		int op,x;cin>>op>>x;
		switch(op){
			case 1:insert(root,x);break;
			case 2:del(root,x);break;
			case 3:cout<<Rank(root,x)+1<<'\n';break;
			case 4:cout<<kth(root,x)<<'\n';break;
			case 5:cout<<pre(root,x)<<'\n';break;
			case 6:cout<<suc(root,x)<<'\n';break;
		}
	}
	return 0;
}

rt

2025/2/6 18:11
加载中...