FHQ Treap 0~23分求调
查看原帖
FHQ Treap 0~23分求调
473256
xxboyxx楼主2024/3/5 22:13

输出是随机的,所以有时全错QAQ

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
	int v,k,l,r,s;
};
node tree[100005];
int n;
int tot=0,root=0;
int newnode(int v)
{
	tree[++tot].v=v;
	tree[tot].k=rand();
	tree[tot].s=1;
	return tot;
}
int pushup(int p)
{
	tree[p].s=tree[tree[p].l].s+tree[tree[p].r].s+1;
}
void split(int p,int v,int &x,int &y)
{
	if (p==0)
	{
		x=0,y=0;
		return;
	}
	if (tree[p].v<=v)
	{
		x=p;
		split(tree[p].r,v,tree[p].r,y);
	}
	else
	{
		y=p;
		split(tree[p].l,v,x,tree[p].l);
	}
	pushup(p);
}
int merge(int x,int y)
{
	if (!x || !y)
		return x+y;
	if (tree[x].k<tree[y].k)
	{
		tree[x].r=merge(tree[x].r,y);
		pushup(x);
		return x;
	}
	else
	{
		tree[y].l=merge(x,tree[y].l);
		pushup(y);
		return y;
	}
}
void ins(int v)
{
	int x,y,z;
	split(root,v,x,y);
	z=newnode(v);
	root=merge(merge(x,z),y);
}
void del(int v)
{
	int x,y,z;
	split(root,v,x,y);
	split(x,v-1,x,y);
	y=merge(tree[y].l,tree[y].r);
	root=merge(merge(x,y),z);
}
int get_k(int p,int k)
{
	if (k<=tree[tree[p].l].s)
		return get_k(tree[p].l,k);
	if (k==tree[tree[p].l].s+1);
		return p;
	return get_k(tree[p].r,k-tree[tree[p].l].s-1);
}
int get_p(int v)
{
	int x,y,ans;
	split(root,v-1,x,y);
	ans=tree[x].s+1;
	root=merge(x,y);
	return ans;
}
int get_s(int v)
{
	int k,ans;
	k=get_k(root,v);
	ans=tree[k].v;
	return ans;
}
int get_q(int v)
{
	int x,y,ans;
	split(root,v-1,x,y);
	int k=get_k(x,tree[x].s);
	ans=tree[k].v;
	root=merge(x,y);
	return ans;
}
int get_h(int v)
{
	int x,y,ans;
	split(root,v,x,y);
	int k=get_k(y,1);
	ans=tree[k].v;
	root=merge(x,y);
	return ans;
}
signed main()
{
	srand(time(0));
	cin>>n;
	while (n--)
	{
		int o,k;
		cin>>o>>k;
		if (o==1)
			ins(k);
		else if (o==2)
			del(k);
		else if (o==3)
			cout<<get_p(k)<<'\n';
		else if (o==4)
			cout<<get_s(k)<<'\n';
		else if (o==5)
			cout<<get_q(k)<<'\n';
		else if (o==6)
			cout<<get_h(k)<<'\n';
	}
	return 0;
}
2024/3/5 22:13
加载中...