treap 58pts求调
查看原帖
treap 58pts求调
1003901
Angela2022楼主2024/7/19 10:49
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct Node{
	int s[2],v,rnd,size;
}t[maxn];
int n,CNT,root;
int New_node(int x){
    CNT++;
	t[CNT].s[0]=t[CNT].s[1]=0;
	t[CNT].v=x;t[CNT].rnd=rand();
	t[CNT].size=1; 
	return CNT;
}
#define pii pair<int,int> 
#define fr first
#define sc second
void pushup(int pos){t[pos].size=t[t[pos].s[0]].size+t[t[pos].s[1]].size+1;}
pii split(int now,int k){
	if(!now)return {0,0};
	if(t[now].v<=k){
		pii tmp=split(t[now].s[1],k);
		t[now].s[1]=tmp.fr;
		pushup(now); 
		return {now,tmp.sc};
	}
	else{
		pii tmp=split(t[now].s[0],k);
		t[now].s[0]=tmp.sc;
		pushup(now);
		return {tmp.fr,now};
	}
}
int merge(int x,int y){
	if(!x||!y)return x^y;
	if(t[x].rnd<t[y].rnd){
		t[x].s[1]=merge(t[x].s[1],y);
		pushup(x);
		return x;
	}
	else{
		t[y].s[0]=merge(x,t[y].s[0]);
		pushup(y);
		return y;
	}
}
void insert(int x){
	pii ans=split(root,x);
	root=merge(ans.fr,merge(New_node(x),ans.sc));
}
void del(int x){
	pii a=split(root,x);pii b=split(a.fr,x-1);
	root=merge(merge(b.fr,merge(t[b.sc].s[0],t[b.sc].s[1])),a.sc);
}
int rk(int x){
	int pos=root,ans=0;
	while(t[pos].size){
		if(t[pos].v<x){
			ans+=t[t[pos].s[0]].size+1;
			pos=t[pos].s[1];
		}
		if(t[pos].v>x)pos=t[pos].s[0];
		if(t[pos].v==x){ans+=t[t[pos].s[0]].size+1;return ans;}
	}
	return ans+1;
}
int find(int k){
	int pos=root;
	while(t[pos].size){
		//cout<<pos<<endl;
		if(t[t[pos].s[0]].size>=k)pos=t[pos].s[0];
		if(t[t[pos].s[0]].size+1==k)return t[pos].v;
		if(t[t[pos].s[0]].size+1<k){k-=t[t[pos].s[0]].size+1;pos=t[pos].s[1];}
	}
}
int pre(int x){
    return find(rk(x)-1);
}
int suf(int x){
	int pos=root,ans=0;
	while(t[pos].size){
		if(t[pos].v>x){
			ans+=t[t[pos].s[1]].size+1;
			pos=t[pos].s[0];
		}
		if(t[pos].v<x)pos=t[pos].s[1];
		if(t[pos].v==x){break;}
    }
	return find(t[root].size-ans+1); 
}
int main(){
	srand(time(0));
	cin>>n;
	for(int i=1;i<=n;i++){
		//ccout(root); 
		int opt,x;
		cin>>opt>>x;
		if(opt==1)insert(x);
		if(opt==2)del(x);
		if(opt==3)cout<<rk(x)<<endl;
		if(opt==4)cout<<find(x)<<endl;
		if(opt==5)cout<<pre(x)<<endl;
		if(opt==6)cout<<suf(x)<<endl;
	}
	return 0;
}
2024/7/19 10:49
加载中...