void Rotate(int x){
int y=f[x],z=f[y],t=ge(x);
pushdown(x),pushdown(y);
tree[y][t]=tree[x][t^1],f[tree[y][t]]=y,tree[x][t^1]=y,f[y]=x,f[x]=z;
if (z) tree[z][(tree[z][1]==y)]=x;
pushup(x),pushup(y);
}
上面是Splay旋转操作的代码。
这里有一个非常致命的问题: pushup(x),pushup(y)的顺序。经过旋转后,此时x是y的父节点,先更新x后更新y会导致x的数据错误。
结果我A了……不信看提交记录……
所以是数据太水还是我很正确?