Treap 0pts求助
查看原帖
Treap 0pts求助
684249
__kd楼主2023/10/6 21:10
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,root,ans;
inline int rand_int(){return rand()<<14|rand();}
struct TTreap{
	int tot;
	struct treap{
		int L,R,num,siz,val,pririty;
	}p[100005];
	inline int new_treap(int x){
		p[++tot].num=p[tot].siz=1;
		p[tot].val=x;
		p[tot].pririty=rand_int();
		return tot;
	}
	inline void pushup(int k){
		p[k].siz=p[p[k].L].siz+p[p[k].R].siz+p[k].num;
	}
	inline void t_left(int &k){
		int t=p[k].R;
		p[k].R=p[t].L;
		p[t].L=k;
		p[t].siz=p[k].siz;
		pushup(k);
		k=t;
	}
	inline void t_right(int &k){
		int t=p[k].L;
		p[k].L=p[t].R;
		p[t].R=k;
		p[t].siz=p[k].siz;
		pushup(k);
		k=t;
	}
	inline void insert(int &k,int x){
		if(!k) return k=new_treap(x),void();
		p[k].siz++;
		if(p[k].val==x) p[k].num++;
		else if(x>p[k].val){
			insert(p[k].R,x);
			if(p[p[k].R].pririty<p[k].pririty)
				t_left(k);
		}
		else{
			insert(p[k].L,x);
			if(p[p[k].L].pririty<p[k].pririty)
				t_right(k);
		}
	}
	inline void delet(int &k,int x){
		if(!k) return;
		if(p[k].val==x){
			if(p[k].num>1){
				p[k].num--;p[k].siz--;
				return;
			}
			if(p[k].L==0||p[k].R==0){
				k=p[k].L|p[k].R;
				return;
			}
			if(p[p[k].L].pririty<p[p[k].R].pririty)
				t_right(k);
			else t_left(k);
			return delet(k,x),void();
		}
		if(p[k].val<x) delet(p[k].R,x);
		else delet(p[k].L,x);
		pushup(k);
	}
	inline int ask_rank(int k,int x){
		if(!k) return 1;
		if(p[k].val==x) return p[p[k].L].siz+1;
		if(x>p[k].val)
			return p[p[k].L].siz+p[k].num+ask_rank(p[k].R,x);
		return ask_rank(p[k].L,x);
	}
	inline int rank(int k,int x){
		if(!k) return 0;
		if(x<=p[p[k].L].siz) return rank(p[k].L,x);
		if(x>p[p[k].L].siz+p[k].num)
			return rank(p[k].R,x-p[p[k].L].siz-p[k].num);
		return p[k].val;
	}
	inline void ask_pre(int k,int x){
		if(!k) return;
		if(p[k].val<x)
			ans=k,ask_pre(p[k].R,x);
		else ask_pre(p[k].L,x);
	}
	inline void ask_sub(int k,int x){
		if(!k) return;
		if(p[k].val>x)
			ans=k,ask_sub(p[k].L,x);
		else ask_sub(p[k].R,x);
	}
}T;
inline int read(){
	register int x=0,t=0;
	static char ch=getchar();
	while(!isdigit(ch)) t|=(ch=='-'),ch=getchar();
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return t?-x:x;
}
signed main(){
	srand(124515);
	n=read();
	while(n--){
		int op=read(),x=read();
		if(op==1) T.insert(root,x);
		if(op==2) T.delet(root,x);
		if(op==3) printf("%lld\n",T.ask_rank(root,x));
		if(op==4) printf("%lld\n",T.rank(root,x));
		if(op==5) T.ask_pre(root,x),printf("%lld\n",T.p[ans].val);
		if(op==6) T.ask_sub(root,x),printf("%lld\n",T.p[ans].val);
//		cout<<root<<endl;
//		for(register int i=1;i<=T.tot;i++){
//			cout<<T.p[i].val<<" "<<T.p[i].siz<<" "<<T.p[i].num<<" "<<T.p[i].L<<" "<<T.p[i].R<<endl;
//		}
	}
	return 0;
}
in:
4
1 10
1 30
1 20
3 21

out:
3

上面这个数据,本地输出3,交上去是5

2023/10/6 21:10
加载中...