ps:由于博主的qwq,把很多实边写成了实链,大家就将就着看吧嘿嘿。
LCT,全称动态树,用于应付不断地加边删边的树的一种算法,非常非常优秀。
因为其经典操作link和cut而被叫做link cut tree(是吗??猜的)
emm link:链接,cut:砍掉(滑稽)
现在我们开始。(先声明LCT维护的是一个森林哈!)
引入:仨链剖分
我们一般提到的三种剖分是:重链剖分,实链剖分,和长链剖分。
前面我们已经讲过的树链剖分实际上就是重链剖分的别称。长链剖分不太常用(但是sslz_fsy非常强三个都会orz),而本次LCT用到的就是实链剖分。
实链剖分
这个不需要特别学习,你只需要知道这种剖分的优点在于:可以调整,即可以变化。(不像重链剖分那样是固定的)
同样,每个节点对儿子只有一个实链,其它都是虚链。这样做的原因是方便splay来维护。(后话)
它的体现是:所有子节点都有father,但father的son只有实链链接的子节点或者原树上的父节点。意思是说你从叶子节点可以一直跳跳跳跳到根节点,每个叶子节点都可以,但对于一个根节点往下走,它的路径是唯一的。
接下来我们说一下,splay在树里面的运转方式。
splay
首先明确:每一个splay维护的是一个深度严格单调递增的链(简单说就是一个严格从祖先到后代的链)。用实链连接起来的一堆点在同一个splay里面。所以整个森林实际上也有很多个splay。
所以说实边虚边在LCT中的体现实际上就是在不在一个splay里面。
每个splay结点维护的值是其在splay中的整个子树的信息和。(比如取最大最小啦,求和或者异或啦)
因为维护的是信息和,所以在作修改的时候为了不影响到别的点,你要先splay上去。
这样就方便我们调用。至于为什么方便,我也说不清楚(手动滑稽)。
基本函数学习
1.access
access函数是非常基本的函数。非常重要。它的意义是:将该点到根节点的这个路径上的所有链变成实链。
这句话的潜含义有二。
1.因为每个点只有一条向下的实链,所以实际上它是将一些实边转换成了轻边,然后硬生生的把一些虚边变成了实边。
2.因为splay维护实边连接起来的点,所以现在,根节点到该节点路径上的所有点包括它们二位都在一个splay里面了。
既然在一个splay里面了,那,就