关于LCT的一点理解

其实没什么价值
老板讲完了LCT基础,高一大佬们提了一个问题。如下。

cut操作本来是这样的

void cut(int x,int y)
{
    makeroot(x);
    ac(y);
    putdown(x);
    splay(y);     <<<<<<<这里
    putdown(y);
    par[ls[y]]=fa[ls[y]]=0;
    lson[y]=0;
}

但如箭头指的地方,为什么要splay这个点呢?

修改后如这样:

void cut(int x,int y)
{
    makeroot(x);
    ac(y);
    putdown(x);
    par[y]=fa[y]=0;
    rson[x]=0;
}

感觉好像没问题,因为x、y是连在一起的。
过了样例。提交。
这里写图片描述
然后就RE了。换原来的函数,可以AC。
为什么呢? 感觉自己好智障啊。
“x、y是连在一起的。”问题就在这里。
这里写图片描述
举个例子。一棵splay(辅助树)如图,红色为x点。实际上y点(蓝)在x点的右子树,而非右儿子。
仔细考虑,既然这棵splay树是以深度为关键字建立的,那么y 点应该为x 点的后继而非儿子。
简而言之,在splay(辅助树)中,x、y两点并未连在一起。能过样例只是因为样例太水,后继就是右儿子。。。

猜你喜欢

转载自blog.csdn.net/includelhc/article/details/79817502