treap求调
查看原帖
treap求调
760171
Binah_cyc楼主2024/7/8 17:54
#include<bits/stdc++.h>
using namespace std;
#define int long long
int _;
int root,tot;
struct Treap
{
	int l,r;
	int val,random;
	int sze,cnt;
} t[100005];
int newnode(int x)
{
	t[++tot].val=x,t[tot].sze=t[tot].cnt=1,t[tot].random=rand();
	return tot;
}
void pushup(int p)
{
	t[p].sze=t[t[p].l].sze+t[t[p].r].sze+1;
}
void build()
{
	newnode(INT_MIN),newnode(INT_MAX);
	root=1,t[1].r=2,pushup(1);
}
void zag(int &p)//左旋
{
	int q=t[p].r;
	t[p].r=t[q].l,t[q].l=p;
	pushup(p),pushup(q),p=q;
}
void zig(int &p)//右旋
{
	int q=t[p].l;
	t[p].l=t[q].r,t[q].r=p;
	pushup(p),pushup(q),p=q;
}
bool ask(int p,int x)
{
	if(p==0) return 0;
	if(t[p].val==x) return 1;
	if(t[p].val<x) return ask(t[p].r,x);
	else  return ask(t[p].l,x);
}
void insert(int &p,int val)
{
	if(p==0) return (void)(p=newnode(val));//没有,新建
	if(t[p].val==val) return (void)(t[p].cnt++);
	if(t[p].val>val) insert(t[p].l,val),(t[p].random<t[t[p].l].random)?zig(p),1:1;
	else insert(t[p].r,val),(t[p].random<t[t[p].r].random)?zag(p),1:1;
	pushup(p);
}
void erase(int &p,int val)
{
	if(t[p].val==val)
	{
		if(t[p].cnt>1) return (void)(t[p].cnt--);
		if(t[p].l||t[p].r)
		{
			if(!t[p].r||t[t[p].l].random>t[t[p].r].random) zig(p),erase(t[p].r,val);
			else zag(p),erase(t[p].l,val);
			pushup(p);
		}
		else p=0;
		return ;
	}
	if(val<t[p].val) erase(t[p].l,val);
	else erase(t[p].r,val);
}
int getrank(int p,int val)
{
	if(p==0) return 0;
	if(t[p].val==val) return t[t[p].l].sze+1;
	if(t[p].val>val)  return getrank(t[p].l,val);
	else return t[t[p].l].sze+t[p].cnt+getrank(t[p].r,val);
}
int getval(int p,int rank)
{
	if(p==0) return INT_MAX;
	if(t[t[p].l].sze>=rank) return getval(t[p].l,rank);
	if(t[t[p].l].sze+t[p].cnt>=rank) return t[p].val;
	else return getval(t[p].r,rank-t[t[p].l].sze-t[p].cnt);
}
int getpre(int p,int x)
{
	int ans=INT_MIN;
	while(p)
	{
		if(x==t[p].val)
		{
			if(t[p].l)
			{
				p=t[p].l;
				while(t[p].r) p=t[p].r;
				ans=t[p].val;
			}
			break;
		}
		(t[p].val<x)?ans=max(ans,t[p].val):1;
		p=(x<t[p].val)?t[p].l:t[p].r;
	}
	return ans;
}
int getnxt(int p,int x)
{
	int ans=INT_MAX;
	while(p)
	{
		if(x==t[p].val)
		{
			if(t[p].r)
			{
				p=t[p].r;
				while(t[p].l) p=t[p].l;
				ans=t[p].val;
			}
			break;
		}
		(t[p].val>x)?ans=min(ans,t[p].val):1;
		p=(x<t[p].val)?t[p].l:t[p].r;
	}
	return ans;
}
signed main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	srand((unsigned)(time(0)));
	cin>>_;
	build();
	while(_--)
	{
		int op,x;
		cin>>op>>x;
		if(op==1) insert(root,x);
		else if(op==2) erase(root,x);
		else if(op==3) cout<<getrank(root,x-1)<<'\n';
		else if(op==4) cout<<getval(root,x+1)<<'\n';
		else if(op==5) cout<<getpre(root,x)<<'\n';
		else if(op==6) cout<<getnxt(root,x)<<'\n';
	}
	return 0;
}
2024/7/8 17:54
加载中...