带旋Treap求调,玄关
查看原帖
带旋Treap求调,玄关
473188
NaHCO3_tht楼主2023/10/19 11:59
#include<bits/stdc++.h>
#define f_inline inline __attribute__((always_inline))
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 5e4+5;
struct Btree{
	int lc,rc,pri,val,sze,cnt;
	#define lc(x) t[x].lc
	#define rc(x) t[x].rc
	#define pri(x) t[x].pri
	#define v(x) t[x].val
	#define s(x) t[x].sze
	#define cnt(x) t[x].cnt
}t[maxn<<1];
int rt,tot;
f_inline void push_up(const int &p){
	s(p) = s(lc(p))+s(rc(p))+cnt(p);
}
f_inline void Zig(int &p){//右旋 
	int k = lc(p);lc(p) = rc(k),rc(k) = p;
	s(k) = s(p); push_up(p);
	return p = k,void();
}
f_inline void Zag(int &p){//左旋 
	int k = rc(p);rc(p) = lc(k),lc(k) = p;
	s(k) = s(p); push_up(p);
	return p = k,void();
}
void Insert(int &p,const int &val){
	if(!p){
		p = ++tot; v(p) = val; pri(p) = rand();
		cnt(p) = s(p) = 1; lc(p) = rc(p) = 0;
		return ; 
	}
	++s(p);
	if(v(p) == val) ++cnt(p);
	else if(val < v(p)){
		Insert(lc(p),val);
		if(pri(lc(p)) < pri(p)) Zig(p);
	}else{
		Insert(rc(p),val);
		if(pri(rc(p)) < pri(p)) Zag(p);
	}
}
void Delete(int &p,const int &val){
	if(v(p) == val){
		if(cnt(p) > 1) --cnt(p),--s(p);
		else if(!lc(p) || !rc(p)) p = lc(p)+rc(p);
		else if(pri(lc(p)) < pri(rc(p))) Zig(p),Delete(p,val);
		else Zag(p),Delete(p,val);
	}
	--s(p);
	if(val < v(p)) Delete(lc(p),val);
	else Delete(rc(p),val);
}
f_inline int Pre(const int &val){
	int p = rt,ret = -INF;
	while(p){
		if(v(p) < val) ret = v(p),p = rc(p);
		else if(v(p) == val) p = lc(p);
		else p = lc(p);
	}
	return ret;
}
f_inline int Suf(const int &val){
	int p = rt,ret = INF;
	while(p){
		if(v(p) > val) ret = v(p),p = lc(p);
		else if(v(p) == val) p = rc(p);
		else p = rc(p);
	}
	return ret;
}
f_inline int QueryRank(const int &val){
	int p = rt,ret = 0;
	while(p){
		if(v(p) == val) return ret+s(lc(p))+1;
		else if(val < v(p)) p = lc(p);
		else ret += s(lc(p))+cnt(p),p = rc(p);
	}
	return ret;
}
f_inline int QueryKth(int k){
	int p = rt;
	while(p){
		if(s(lc(p)) < k && s(lc(p))+cnt(p) >= k) return v(p);
		if(s(lc(p)) >= k) p = lc(p);
		else k -= s(lc(p))+cnt(p),p = rc(p);
	}
	return 0;
}
int n; 
int main(){
	cin>>n;
	while(n --> 0){
		int opt;
		cin>>opt;
		if(opt == 1){
			int x;cin>>x;
			Insert(rt,x);
		}
		if(opt == 2){
			int x;cin>>x;
			Delete(rt,x);
		}
		if(opt == 3){
			int x;cin>>x;
			cout<<QueryRank(x)<<'\n';
		}
		if(opt == 4){
			int k;cin>>k;
			cout<<QueryKth(k)<<'\n';
		}
		if(opt == 5){
			int x;cin>>x;
			cout<<Pre(x)<<'\n';
		}
		if(opt == 6){
			int x;cin>>x;
			cout<<Suf(x)<<'\n';
		}
	}
	return 0;
}
2023/10/19 11:59
加载中...