可持久化fhq求调
查看原帖
可持久化fhq求调
613082
qscisQJing楼主2024/11/7 22:35

应该是建出来的树的正确性有问题,在随机权值的情况下答案也随机

#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
#define ll long long
#define pi pair<int,int>
int n,ls[MAXN*90],rs[MAXN*90],rt[MAXN];
int w[MAXN*90],val[MAXN*90],cnt[MAXN*90],siz[MAXN*90],vtx;
int irand()
{
	return 32000*rand()+rand();
}
int getnode(int v)
{
	vtx++;
	w[vtx]=irand();
	cnt[vtx]++;
	siz[vtx]++;
	val[vtx]=v;
	return vtx;
}
void cpy(int x,int y)
{
	ls[x]=ls[y],rs[x]=rs[y];
	cnt[x]=cnt[y],val[x]=val[y];
	siz[x]=siz[y],w[x]=w[y];
}
void pushup(int rt)
{
	siz[rt]=cnt[rt]+siz[ls[rt]]+siz[rs[rt]];
}
pair<int,int> split(int rt,int k)
{
	if(!rt)return {0,0};
	int dir=getnode(0);
	cpy(dir,rt);
	if(k<val[rt])
	{
		pi tmp=split(ls[rt],k);
		ls[dir]=tmp.second;
		pushup(dir);
		return {tmp.first,dir};
	}
	else 
	{
		pi tmp=split(rs[rt],k);
		rs[dir]=tmp.first;
		pushup(dir);
		return {dir,tmp.second};
	}
}
int merge(int x,int y)
{
	if(!x&&!y)return 0;
	int dir=getnode(0);
	if(!x)
	{
		cpy(dir,y);
		return dir;
	}
	if(!y)
	{
		cpy(dir,x);
		return dir;
	}
	if(w[x]>w[y])
	{
		cpy(dir,x);
		rs[dir]=merge(rs[x],y);
	}
	else
	{
		cpy(dir,y);
		ls[dir]=merge(x,ls[y]);
	}
	pushup(dir);
	return dir;
}
int getrnk(int rt,int k)
{
	if(!rt)return 1;
	if(val[rt]==k)return 1+siz[ls[rt]];
	if(k<val[rt])return getrnk(ls[rt],k);
	return siz[ls[rt]]+cnt[rt]+getrnk(rs[rt],k);
}
int getval(int rt,int rk)
{
	if(siz[ls[rt]]>=rk)return getval(ls[rt],rk);
	if(siz[ls[rt]]+cnt[rt]>=rk)return val[rt];
	return getval(rs[rt],rk-siz[ls[rt]]-cnt[rt]);
}
int getpre(int rt,int k)
{
	if(!rt)return -2147483647;
	if(k<=val[rt])return getpre(ls[rt],k);
	return max(getpre(rs[rt],k),val[rt]);
}
int getsuf(int rt,int k)
{
	if(!rt)return 2147483647;
	if(k>=val[rt])return getsuf(rs[rt],k);
	return min(getsuf(ls[rt],k),val[rt]);
}
int main()
{
//	freopen("fhq.in","r",stdin);
//	freopen("fhq.out","w",stdout);
	srand(time(0));
	cin>>n;int asdf=1;
	for(int i=1;i<=n;i++)
	{
		int v,opt,k;asdf++;
		scanf("%d%d%d",&v,&opt,&k);
		if(opt==1)
		{
			int x,y,z;asdf--;
			pi tmp=split(rt[v],k);
			z=tmp.second;
			tmp=split(tmp.first,k-1);
			x=tmp.first,y=tmp.second;
			if(y)cnt[y]++;
			else y=getnode(k);
			rt[i]=merge(merge(x,y),z);
		}
		if(opt==2)
		{
			int x,y,z;asdf--;
			pi tmp=split(rt[v],k);
			z=tmp.second;
			tmp=split(tmp.first,k-1);
			x=tmp.first,y=tmp.second;
			if(!y)
			{
				rt[i]=merge(x,z);
				continue;
			}
			cnt[y]--;
			if(cnt[y])rt[i]=merge(merge(x,y),z);
			else rt[i]=merge(x,z);
		}
		if(opt==3)
		{
			rt[i]=rt[v];
			printf("%d\n",getrnk(rt[v],k));
		}
		if(opt==4)
		{
			rt[i]=rt[v];
			printf("%d\n",getval(rt[v],k));
		}
		if(opt==5)
		{
			rt[i]=rt[v];
			printf("%d\n",getpre(rt[v],k));
		}
		if(opt==6)
		{
			rt[i]=rt[v];
			printf("%d\n",getsuf(rt[v],k));
		}
	}
	return 0;
}
2024/11/7 22:35
加载中...