为什么回收删除的点会WA?
查看原帖
为什么回收删除的点会WA?
234356
方杰123楼主2022/11/16 11:53
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5*50;
int read(){
	int x=0,f=1;char c=getchar();
	while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();} 
	while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
struct node{
	int val,rad,size;
}e[N];
int ls[N],rs[N],rt[N],cnt,x,y,z,dust[N],bin,n;

int newnode(int val){
	int xv=bin?dust[bin--]:++cnt;
	e[xv].rad=rand(),e[xv].val=val,e[xv].size=1;ls[xv]=0,rs[xv]=0;
	return xv;
}
void pushup(int u){e[u].size=1+e[ls[u]].size+e[rs[u]].size;return;}
int clone(int u){
	int xv=bin?dust[bin--]:++cnt;
	e[xv]=e[u];ls[xv]=ls[u];rs[xv]=rs[u];
	return xv;
}
void split(int u,int val,int &x,int &y){
	if(!u)x=y=0;
	else{
		if(e[u].val<=val){x=clone(u);split(rs[x],val,rs[x],y);pushup(x);}
		else{y=clone(u);split(ls[y],val,x,ls[y]);pushup(y);}
	}
	return;
}
int merge(int A,int B){
	if(!A || !B)return A+B;
	else{
		if(e[A].rad<e[B].rad){
			int tmp=clone(A);
			rs[tmp]=merge(rs[tmp],B);
			pushup(tmp);
			return tmp;
		}
		else{
			int tmp=clone(B);
			ls[tmp]=merge(A,ls[tmp]);
			pushup(tmp);
			return tmp;
		}
	}
}
void insert(int &u,int val){
	split(u,val,x,y);
	u=merge(merge(x,newnode(val)),y);
	return;
}
void erase(int &u,int val){
	split(u,val-1,x,y);
	split(y,val,y,z);
	//dust[++bin]=y;  这里不注释掉就错
	y=merge(ls[y],rs[y]); 
	u=merge(merge(x,y),z);
	return;
}
int get_rank(int u,int val){
	if(!u)return 0;
	if(val<e[u].val)return get_rank(ls[u],val);
	if(val==e[u].val)return e[ls[u]].size+get_rank(rs[u],val);
	if(val>e[u].val)return 1+e[ls[u]].size+get_rank(rs[u],val);
}
int kth(int u,int k){
	if(!u)return 0;
	if(k<=e[ls[u]].size)return kth(ls[u],k);
	if(k<=e[ls[u]].size+1)return u;
	return kth(rs[u],k-1-e[ls[u]].size);
}
int pre(int &u,int val){
	split(u,val-1,x,y);
	int tmp=kth(x,e[x].size);
	u=merge(x,y);
	return e[tmp].val;
}
int nxt(int &u,int val){
	split(u,val,x,y);
	int tmp=kth(y,1);
	u=merge(x,y);
	return e[tmp].val;
}
signed main(){ 
	int seed='L'+'J'+'P'+'i'+'n'+'g'+'H'+'e'+'n'+'g'+'S'+'h'+'u'+'H'+'u'+'i'+'W'+'o'+'Q'+'i'+'n'+'g'+'C'+'h'+'u'+'n';srand(seed); 
	n=read();int v,opt,val,k;
	insert(rt[0],-2147483647);insert(rt[0],2147483647);
	for(int i=1;i<=n;i++){
		v=read(),opt=read();rt[i]=rt[v];
		if(opt==1){val=read();insert(rt[i],val);}
		if(opt==2){val=read();erase(rt[i],val);}
		if(opt==3){val=read();printf("%d\n",get_rank(rt[i],val))-1;}
		if(opt==4){k=read();printf("%d\n",e[kth(rt[i],k+1)].val);}
		if(opt==5){val=read();printf("%d\n",pre(rt[i],val));} 
		if(opt==6){val=read();printf("%d\n",nxt(rt[i],val));}
	}
	return 0;
}

61行是回收点的代码。

2022/11/16 11:53
加载中...