一般splay树中的rotate函数有两部分,连父亲,连儿子(我的写法),但是在LCT中必须 先处理儿子边
原因是,因为要判断 f 是否是辅助树的根节点,如果先连了 f 的父亲,就会导致这个判断失误。
正确
void rot(int u)
{
int f=fa[u],f2=fa[f],i=id(u),i2=id(f),w=ch[u][i^1];
if (!rt(f)) ch[f2][i2]=u; ch[u][i^1]=f; ch[f][i]=w;
if (w) fa[w]=f; fa[f]=u; fa[u]=f2;
up(f); up(u);
}
错误
void rot(int u)
{
int f=fa[u],f2=fa[f],i=id(u),i2=id(f),w=ch[u][i^1];
if (w) fa[w]=f; fa[f]=u; fa[u]=f2;
if (!rt(f)) ch[f2][i2]=u; ch[u][i^1]=f; ch[f][i]=w;
up(f); up(u);
}