萌新刚学OI,Treap板子求调玄关
查看原帖
萌新刚学OI,Treap板子求调玄关
736237
codingwen楼主2024/10/29 21:10
#include<bits/stdc++.h>
using namespace std;
struct node{
	int l,r;
	int val,dat;
	int cnt,size;
}a[100010];
int tot,rt;
int nw(int x){
	a[++tot].val=x;
	a[tot].dat=rand();
	a[tot].cnt=a[tot].size=1;
	return tot;
}
void pushup(int p){a[p].size=a[a[p].l].size+a[a[p].r].size+a[p].cnt;}
void build(){
	nw(-1e9);
	nw(1e9);
	a[1].r=2;
	pushup(rt); 
}
int rk_val(int p,int val){
	if(!p)return 0;
	if(val==a[p].val)return a[a[p].l].size+1;
	if(val<a[p].val)return rk_val(a[p].l,val);
	return rk_val(a[p].r,val)+a[a[p].l].size+a[p].cnt;
}
int val_rk(int p,int rk){
	if(!p)return 0;
	if(a[a[p].l].size>=rk)return val_rk(a[p].l,rk);
	if(a[a[p].l].size+a[p].cnt>=rk)return a[p].val;
	return val_rk(a[p].r,rk-a[a[p].l].size-a[p].cnt);
}
void zig(int &p){
	int q=a[p].l;
	a[p].l=a[q].r;
	a[q].r=p;
	p=q;
	pushup(a[p].r);
	pushup(p);
}
void zag(int &p){
	int q=a[q].r;
	a[p].r=a[q].l;
	a[q].l=p;
	p=q;
	pushup(a[p].l);
	pushup(p);
}
void ins(int &p,int val){
	if(!p){
		p=nw(val);
		return ;
	}
	if(val==a[p].val){
		a[p].cnt++;
		pushup(p);
		return ;
	}
	if(val<a[p].val){
		ins(a[p].l,val);
		if(a[p].dat<a[a[p].l].dat)zig(p);
	}else{
		ins(a[p].r,val);
		if(a[p].dat<a[a[p].r].dat)zag(p);
	}
	pushup(p);
}
int pre(int val){
	int ans=1;
	int p=rt;
	while(p){
		if(val==a[p].val){
			if(a[p].l>0){
				p=a[p].l;
				while(a[p].r>0)p=a[p].r;
				ans=p;
			}
			break;
		}
		if(a[p].val<val && a[p].val>a[ans].val)ans=p;
		p=val<a[p].val?a[p].l:a[p].r;
	}
	return a[ans].val;
}
int nxt(int val){
	int ans=2;
	int p=rt;
	while(p){
		if(val==a[p].val){
			if(a[p].r>0){
				p=a[p].r;
				while(a[p].l>0)p=a[p].l;
				ans=p;
			}
			break;
		}
		if(a[p].val>val && a[p].val<a[ans].val)ans=p;
		p=val<a[p].val?a[p].l:a[p].r;
	}
	return a[ans].val;
}
void del(int &p,int val){
	if(!p)return ;
	if(val==a[p].val){
		if(a[p].cnt>1){
			a[p].cnt--;
			pushup(p);
			return ;
		}
		if(a[p].l || a[p].r){
			if(a[p].r==0 || a[a[p].l].dat>a[a[p].r].dat){
				zig(p);
				del(a[p].r,val);
			}else{
				zag(p);
				del(a[p].l,val);
			}
			pushup(p);
		}else p=0;
		return ;
	}
	val<a[p].val?del(a[p].l,val):del(a[p].r,val);
	pushup(p);
}
int main(){
	build();
	int q;
	cin>>q;
	while(q--){
		int op,x;
		cin>>op>>x;
		if(op==1)ins(rt,x);
		if(op==2)del(rt,x);
		if(op==3)cout<<rk_val(rt,x)-1<<endl;
		if(op==4)cout<<val_rk(rt,x+1)<<endl;
		if(op==5)cout<<pre(x)<<endl;
		if(op==6)cout<<nxt(x)<<endl;
	}
	return 0;
}

2024/10/29 21:10
加载中...