其实没什么价值
老板讲完了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两点并未连在一起。能过样例只是因为样例太水,后继就是右儿子。。。