马蜂还可以的fhq treap求调WA8-12
查看原帖
马蜂还可以的fhq treap求调WA8-12
524994
Ptilopsis_楼主2025/2/3 16:16
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+2;
mt19937 rd(time(0));
int n,root,sz[N],val[N],cnt[N],ls[N],rs[N],pri[N],idx;
void push_up(int rt)
{
	sz[rt]=sz[ls[rt]]+sz[rs[rt]]+cnt[rt];
}
void split(int rt,int p,int &rt1,int &rt2)
{
	if(!rt)
	{
		rt1=rt2=0;
		return;
	}
	if(sz[ls[rt]]>=p)
	{
		split(ls[rt],p,rt1,rt2);
		ls[rt]=rt2;
		push_up(rt);
		rt2=rt;	
	} 
	else
	{
		split(rs[rt],p-sz[ls[rt]]-cnt[rt],rt1,rt2);
		rs[rt]=rt1;
		push_up(rt);
		rt1=rt;	
	}
}
int merge(int rt1,int rt2)
{
	if(!rt1)
		return rt2;
	if(!rt2)
		return rt1;
	if(pri[rt1]<pri[rt2])
	{
		rs[rt1]=merge(rs[rt1],rt2);
		push_up(rt1);
		return rt1;
	}
	else
	{
		ls[rt2]=merge(rt1,ls[rt2]);
		push_up(rt2);
		return rt2;
	}
}
int rk(int rt,int v)
{
    if(!rt) 
		return 0;
    if(v<val[rt])
		return rk(ls[rt],v);
	else
		return sz[ls[rt]]+cnt[rt]+rk(rs[rt],v);
}
void insert(int v)
{
	int p=rk(root,v);
	int rt1,rt2,rt3,rt;
	split(root,p,rt,rt3);
	split(rt,p-1,rt1,rt2);
	if(val[rt2]==v)
		cnt[rt2]++,sz[rt2]++;
	else
	{
		val[++idx]=v,sz[idx]=cnt[idx]=1,pri[idx]=rd();
		rt2=merge(rt2,idx);
	}
	root=merge(merge(rt1,rt2),rt3);
}
void del(int v)
{
	int p=rk(root,v);
	int rt1,rt2,rt3,rt;
	split(root,p,rt,rt3);
	split(rt,p-1,rt1,rt2);
	cnt[rt2]--,sz[rt2]--;
	if(cnt[rt2]==0)
		root=merge(rt1,rt3);
	else
		root=merge(merge(rt1,rt2),rt3);
}
int kth(int p)
{
	int rt1,rt2,rt3,rt;
	split(root,p,rt,rt3);
	split(rt,p-1,rt1,rt2);
	root=merge(merge(rt1,rt2),rt3);
	return val[rt2];
}
int qian(int v) 
{
	return kth(rk(root,v-1));
}
int hou(int v)
{
	return kth(rk(root,v)+1);
}
int main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	int u,op;
	for(int i=1;i<=n;i++)
	{
		cin>>op>>u;
		if(op==1)
			insert(u);
		if(op==2)
			del(u);
		if(op==3)
			cout<<rk(root,u-1)+1<<endl;
		if(op==4)
			cout<<kth(u)<<endl;
		if(op==5)
			cout<<qian(u)<<endl;
		if(op==6)
			cout<<hou(u)<<endl;
	} 
}
2025/2/3 16:16
加载中...