fhq treap 60pts 求助
查看原帖
fhq treap 60pts 求助
280604
DiDi123楼主2022/3/21 22:08
#include <bits/stdc++.h>
using namespace std;
#define MAXN 200001
struct fhq
{
	int rd,son,val,l,r;
}t[MAXN];
int tsz,root;
int create(int k)
{
	t[++tsz].rd=rand();
	t[tsz].son=1;
	t[tsz].val=k;
	t[tsz].l=t[tsz].r=0;
	return tsz;
}
void pushup(int rt)
{
	if(rt) t[rt].son=t[t[rt].l].son+t[t[rt].r].son+1;
}
void split_number(int rt,int k,int &x,int &y)
{
	if(!rt)
	{
		x=y=0;
		return;
	}
	if(t[rt].val<=k)
	{
		x=rt;
		split_number(t[rt].r,k,t[rt].r,y);
	}
	else
	{
		y=rt;
		split_number(t[rt].l,k,x,t[rt].l);
	}
	pushup(rt);
}
int merge(int x,int y)
{
	// t[x].val<t[y].val
//	if(t[x].val>t[y].val) swap(x,y);
	if(!x || !y) return x+y;
	if(t[x].rd>t[y].rd)
	{
		t[x].r=merge(t[x].r,y);
		pushup(x);
		return x;
	}
	else
	{
		t[y].l=merge(x,t[y].l);
		pushup(y);
		return y;
	}
}
void insert(int k)
{
	int x,y;
	split_number(root,k,x,y);
	root=merge(merge(x,create(k)),y);
}
void Delete(int k)
{
	int x,y,z;
	split_number(root,k,x,z);
	split_number(x,k-1,x,y);
	if(y) y=merge(t[y].l,t[y].r);
	root=merge(merge(x,y),z);
}
int get_kth(int k,int x)
{
	if(!k) return 0;
	if(x<=t[t[k].l].son) return get_kth(t[k].l,x);
	if(x==t[t[k].l].son+1) return t[k].val;
	else return get_kth(t[k].r,x-t[t[k].l].son-1);
}
int get_rank(int k,int x)
{
	if(!k) return 0;
	if(x<t[k].val) return get_rank(t[k].l,x);
	if(x==t[k].val) return t[t[k].l].son;
	else return get_rank(t[k].r,x)+t[t[k].l].son+1;
}
int get_pre(int x)
{
	return get_kth(root,get_rank(root,x));
}
int get_after(int x)
{
	return get_kth(root,get_rank(root,x+1)+1);
}
int main()
{
	int n,opt,x;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>opt>>x;
		if(opt==1) insert(x);
		else if(opt==2) Delete(x);
		else if(opt==3) cout<<get_rank(root,x)+1<<endl;
		else if(opt==4) cout<<get_kth(root,x)<<endl;
		else if(opt==5) cout<<get_pre(x)<<endl;
		else if(opt==6) cout<<get_after(x)<<endl;
	}
}
2022/3/21 22:08
加载中...