求助关于 可持久化fhqTreap 的一个问题
查看原帖
求助关于 可持久化fhqTreap 的一个问题
83353
XLao楼主2023/1/2 19:25

void split(int pos,int x,int &posl,int &posr)

之前打成 int &pos ,在 erase 操作中会有影响。

但是样例第一次 insert 的时候,assert 却报错了。pos 不知为啥变成了 0。

split:

int node,L[N*100],R[N*100],root[N],rd[N*100],val[N*100],size[N*100];
void pushup(int pos) {size[pos]=size[L[pos]]+size[R[pos]]+1;}
void copy(int &pos)
{
	L[++node]=L[pos], R[node]=R[pos];
	rd[node]=rd[pos], val[node]=val[pos], size[node]=size[pos];
	pos=node;
}
void split(int pos,int x,int &posl,int &posr)
{
	if(!pos) {posl=posr=0; return;}
	copy(pos);
	if(val[pos]<=x) posl=pos, split(R[pos],x,R[posl],posr);
	else posr=pos, split(L[pos],x,posl,L[posr]);
	assert(pos!=0); pushup(pos);
}

insert:

	mt19937 rnd(time(NULL));
	rd[++node]=rnd(), val[node]=-inf, size[node]=1;
	rd[++node]=rnd(), val[node]=inf, L[node]=1, pushup(2); root[0]=2;
	n=read();
	for(int i=1,v,type,x;i<=n;++i)
	{
		v=read(), type=read(), x=read(); root[i]=root[v];
//		dfs(root[i]); puts("st");
		if(type==1)
		{
			split(root[i],x,r1,r2);
			rd[++node]=rnd(), val[node]=x, size[node]=1;
			root[i]=merge(merge(r1,node),r2);
		}
      ……
    }
2023/1/2 19:25
加载中...