void cut(int x,int y){
Makeroot(x);
if (Findroot(y)==x&&f[y]==x&&c[y][0]==0){
f[y]=c[x][1]=0;
pushup(x);
}
}
如果把这段代码给改一下:
void cut(int x,int y){
Makeroot(x);
if (Findroot(y)==x&&f[y]==x){//changes here
f[y]=c[x][1]=0;
pushup(x);
}
}
依然能够 AC 。
几乎所有题解都采用了上面的写法,而且通过我的观察,下面的写法是错误的。如果不判断 y 的左儿子是否为空,那么可能会出现节点卡在了 x,y 之间的情况;前面的 fy=x 与 Findroot(y)=x 并不足以判断此种情况。
综上所述,请求加强数据。