提供一个问题,对样例2第二个输出346(或者其它)的或许有帮助
查看原帖
提供一个问题,对样例2第二个输出346(或者其它)的或许有帮助
106248
Loliconrz楼主2021/1/1 10:57

一般splay树中的rotate函数有两部分,连父亲,连儿子(我的写法),但是在LCT中必须 先处理儿子边 原因是,因为要判断 ff 是否是辅助树的根节点,如果先连了 ff 的父亲,就会导致这个判断失误。

正确

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);
}
2021/1/1 10:57
加载中...