在 cut
函数中,正确的写法如下:
void cut(node * x, node * y)
{
split(x, y);
if (findroot(y) != x || y -> fa != x || y -> son[0] != NULL) return ;
y -> fa = x -> son[1] = NULL;
update(x);
}
而如果我们写成这个样子
void cut(node * x, node * y)
{
split(x, y);
if (findroot(y) != x || y -> fa != x || y -> son[0] != NULL) return ;
y -> fa = NULL;
}
也是对的。
为什么呢?我们考虑所有操作最终都会归于 splay
。而 splay
是从下往上进行的,找不到 fa
就会退出。所以我们仅仅是“认子不认父”也能 AC。。。