逆流之时 @ 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
@逆流之时 可以发题解