一个容易弄错的地方

P3391 【模板】文艺平衡树

逆流之时 @ 2019-11-10 07:40:26

注意这里的Splay与P3369的Splay的区别。

P3369的节点可以依靠权值大小关系确定父子节点和左右儿子关系,但这里不行。

比如rotate函数:

void rotate(int x){
    int f=fa[x],gf=fa[f];
    push_down(f);
    push_down(x);
    bool flag=get(x);
    ch[f][flag]=ch[x][flag^1];
    fa[ch[x][flag^1]]=f;
    ch[x][flag^1]=f;
    fa[f]=x;
    fa[x]=gf;
    //if(gf)ch[gf][val[x]>val[gf]]=x;注意这一句
    if(gf)ch[gf][f==ch[gf][1]]=x;//这一种写法才是正确的
    push_up(f);
    push_up(x);
}

我就因为被注释的那一句调了很久,但因为我在P3369写的Splay的旋转函数与这里被注释的那一句一样,导致我调试时没有在意rotate函数。

希望大家第一次写Splay时不要犯这样的错误。

还要感谢@人间过客 认真帮我调试。


by C3765428 @ 2019-11-10 08:07:44

@逆流之时 可以发题解


|