Treap 23pts求条
查看原帖
Treap 23pts求条
705058
BGM114514楼主2025/6/24 21:07
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
struct Treap{
	int ch[maxn][2],sz[maxn],w[maxn],pri[maxn],val[maxn],tot;
	int ans,rt;
	void pushup(int now){
		sz[now]=w[now]+sz[ch[now][0]]+sz[ch[now][1]];
	}
	void rotate(int& x,bool p){
		int tmp=ch[x][p];
		ch[x][p]=ch[tmp][p^1];
		ch[tmp][p^1]=x;
		sz[tmp]=sz[x];
		pushup(x);
		x=tmp; 
	}
	void insert(int &k,int v){
		if(!k){
			pri[++tot]=rand();
			val[tot]=v;
			w[tot]=sz[tot]=1;
			k=tot;
			return;
		}
		if(val[k]==v){
			sz[k]++;
			w[k]++;
			return;
		}
		sz[k]++;
		if(v<val[k]){
			if(ch[k][0])insert(ch[k][0],v);
		}
		if(v<val[k]){
			insert(ch[k][0],v);
			if(pri[k]>pri[ch[k][0]])rotate(k,0);
		}else{
			insert(ch[k][1],v);
			if(pri[k]>pri[ch[k][1]])rotate(k,1);
		}
	}
	bool remove(int& k,int v){
		if(!k){
			return 0;
		}
		if(val[k]==v){
			if(w[k]>1){
				sz[k]--;
				w[k]--;
				return 1;
			}
			if(pri[ch[k][0]]>pri[ch[k][1]])rotate(k,0),remove(ch[k][1],v);
			else rotate(k,1),remove(ch[k][0],v);
			return 1;
		}
		if(val[k]>v){
			bool d=remove(ch[k][0],v);
			sz[k]-=d;
			return d;
		}else{
			bool d=remove(ch[k][1],v);
			sz[k]-=d;
			return d;
		}
	}
	int rnk(int k,int v){
		if(!k)return -1;
		if(val[k]==v){
			return sz[ch[k][0]]+1;
		}
		int ans=0;
		if(val[k]<v){
			ans+=sz[ch[k][0]]+w[k];
			ans+=rnk(ch[k][1],v); 
		}else{
			ans+=rnk(ch[k][0],v);
		}
		return ans;
	}
	int findk(int k,int x){
		if(!k)return inf;
		if(x<=sz[ch[k][0]]){
			return findk(ch[k][0],x);
		}else if(x<=sz[ch[k][0]]+w[k]){
			return val[k];
		}else{
			return findk(ch[k][1],x-sz[ch[k][0]]-w[k]);
		}
	}
	void pre(int k,int v){
		if(!k)return;
		if(v<=val[k]){
			pre(ch[k][0],v);
		}else{
			ans=val[k],pre(ch[k][1],v);
		}
	}
	void suf(int k,int v){
		if(!k)return;
		if(v>=val[k]){
			suf(ch[k][1],v);
		}else{
			ans=val[k],suf(ch[k][0],v);
		}
	}
}t;
int n,op,x;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	srand(time(0));
	cin>>n;
	while(n--){
		cin>>op>>x;
		if(op==1)t.insert(t.rt,x);
		if(op==2)t.remove(t.rt,x);
		if(op==3)cout<<t.rnk(t.rt,x)<<"\n";
		if(op==4)cout<<t.findk(t.rt,x)<<"\n";
		if(op==5)t.pre(t.rt,x),cout<<t.ans<<"\n";
		if(op==6)t.suf(t.rt,x),cout<<t.ans<<"\n";
	}
	return 0;
}

dalao帮我调一下。。。

2025/6/24 21:07
加载中...