Treap求助
查看原帖
Treap求助
285617
黑影洞人楼主2022/3/23 15:01

rt

#include<cstdio>
#include<algorithm>
#define int long long
#define N 1919810
#define inf 2147483647
#define void inline void
using namespace std;
struct Treap{
	int lc,rc,val,priority,count,size;
	#define lc(x) s[x].lc
	#define rc(x) s[x].rc
	#define v(x) s[x].val
	#define p(x) s[x].priority
	#define c(x) s[x].count
	#define s(x) s[x].size
}s[N];
int n,m,pool;
void update(int &p){
	s(p)=s(lc(p))+s(rc(p))+c(p);
}
void zig(int &p){
	int y=lc(p);
	lc(p)=rc(y);rc(y)=p;
	s(y)=s(p);update(p);
	p=y;
}
void zag(int &p){
	int y=rc(p);
	rc(p)=lc(y);lc(y)=p;
	s(y)=s(p);update(p);
	p=y;
}
void insert(int &p,int val){
	if(!p){
		v(p)=val;p(p)=rand();//随机数据保证Treap相对平衡
		c(p)=s(p)=1;lc(p)=rc(p)=0; 
	}else s(p)++;
	if(v(p)==val)c(p)++;
	else if(val<v(p)){
		insert(lc(p),val);
		if(p(lc(p))<p(p))zig(p);
	}else{
		insert(rc(p),val);
		if(p(rc(p))<p(p))zag(p);
	}
}
//void del(int &p,int val){
//	if(v(p)==val){
//		if(c(p)>1)c(p)--,s(p)--;
//		else if(!lc(p)||!rc(p))p=lc(p)+rc(p);
//		else if(p(lc(p))<p(rc(p)))zig(p),del(p,val);
//		else zag(p),del(p,val);
//	}
//	s(p)--;
//	if(val<v(p))del(lc(p),val);
//	else del(rc(p),val);
//}
inline int prev(int val){
	int x=pool,res=-inf;
	while(x){
		if(v(x)<=val)res=v(x),x=rc(x);
		else x=lc(x);
	}
	return res;
}
inline int next(int val){
	int x=pool,res=inf;
	while(x){
		if(v(x)>=val)res=v(x),x=lc(x);
		else x=rc(x);
	}
	return res;
}
inline int rank(int val){
	int x=pool,res=0;
	while(x){
		if(val==v(x))return res+s(lc(x))+1;
		if(val<v(x))x=lc(x);
		else res+=s(lc(x))+c(x),x=rc(x);
	}
	return res;
}
inline int kth(int &p){
	int x=pool;
	while(x){
		if(s(lc(x))<p&&s(lc(x))+c(x)>=p)return v(x);
		if(s(lc(x))>=p)x=lc(x);
		else p-=s(lc(x))+c(x),x=rc(x);
	}
	return 0;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		int op,x;
		scanf("%lld%lld",&op,&x);
		if(op==1)printf("%lld\n",rank(x));
		if(op==2)printf("%lld\n",kth(x));
		if(op==3)printf("%lld\n",prev(x));
		if(op==4)printf("%lld\n",next(x));	
		if(op==5)insert(++pool,x);
	}
	return 0;
}



2022/3/23 15:01
加载中...