LCT学习(被虐)记 持续更新(被虐)

(http://www.elijahqi.win/2018/01/27/lct%E5%AD%A6%E4%B9%A0%E8%A2%AB%E8%99%90%E8%AE%B0-%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0%E8%A2%AB%E8%99%90/)
上午和icefox巨佬和visjiao巨佬模拟了noiwc2016的试题 icefox巨佬85visjiao也75orz辣鸡蒟蒻我比两位菜多了 据说那一年80就au了恭喜icefox巨佬 蒟蒻我好菜好菜啊

先放毒 引入滕老师给予的 学习资料中的一张图

LCT学习(被虐)记 持续更新(被虐)_第1张图片
Link-Cut Trees 是由 Sleator 和 Tarjan 发明的解决这类动态树问题的一种数据结构。

这个数据结构可以在均摊 O(logn) 的时间内实现上述动态树问题的每个操作。

如果没有用对树的形态的改变的话,我们可以用树链剖分,把树剖分成许多条链并维护上面的权值信息。

然而对于树的形态的改变,树链的剖分方案也要改变,我们借助 Splay 的思想来动态维护许多树链(称为 Link-Cut Trees)。

lct是处理节点无序的有根树组成的森林,进行一些列操作(例如合并,剪切,翻转,更新…

刚刚前面所说lct与树链剖分十分相似 没错lct也包含重链的这种思想 有了这种思想 我们便可以在log的时间复杂度内维护长度为n的链 注意 在lct中 单独的一个点也算一条重链 针对每条链我用splay来维护每条链 因为不停的改变树的形态 所以 重链也在不停的改变 所以我们需要不停的切割合并 所以维护链的数据结构使用了splay 每个点到他重儿子的边叫重链 针对这个链 我们用splay维护 某个点在他左边的点就是在真实树中深度比他浅的点 在他右边的点 就是真实树中深度比他深的点

然后我们还需要知道其中的一些常用操作

1、Access 2、makeroot

Access 将当前节点打通到根 这是什么操作?就是因为存在轻重两条边 所以我Access一下就是将这个节点和根节点放到一个splay上 怎么搞 首先我先转到自己的根 然后深度比我大的点都断开 变成轻边 然后我自己跳上去到达上一层的点 并且把自己和我和上一层点之间的点都连在一条splay上 然后如此反复知道跳到真正的树根 这时候我就和树根在同一个splay上了

此文解释了一开始的那张图

首先,由于访问了点 v,那么它的 Preferred Child 应当消失。先将点 v 旋转到它所属的 Auxiliary Tree 的根,如果 v 在 v 所属的 Auxiliary Tree 中有右儿子(也就是 v 原来的 Preferred Child), 那么应该将 v 在 v 所属的 Auxiliary Tree 中的右子树(对应着它的原来的 Preferred Child 之下的 Preferred Path)从 v 所属的 Auxiliary Tree 中分离,并设置这个新的 Auxiliary Tree 的 Path Parent 为 v。然后,如果点 v 所属的 Preferred Path 并不包含根结点,设它的 Path Parent 为 u,那么需要将 u 旋转 到 u 所属的 Auxiliary Tree 的根,并用点 v 所属的 Auxiliary Tree 替换到点 u 所属的 Auxiliary Tree 中 点 u 的右子树,再将原来点 u 所属的 Auxiliary Tree 中点 u 的右子树的 Path Parent 设置为 u。如此操作,直到到达包含根结点的 Preferred Path

2、makeroot顾名思义就是换根的操作 怎么个操作?就是把我当前这个点变成根 可以想象把我提起来之后其他点都随着重力垂下去的情景 怎么搞 当然是首先把我自己和根打通Access 然后splay(x)将我自己转到根 然后这时候因为存在一点问题 我是splay的根 但是因为定义缘故我左边的都是比我浅的点 根据这个定义我给我整棵树翻转一下就可以变成以我为顶点且我的深度最小的点(反转打懒标记即可

3、find 判断两个节点x,y是否在同一棵树上 首先 我们同理将x 打通到根 然后将x转至splay的根节点 这时候一路向下找到深度最浅的点就是我这棵真实树上的根 然后 y同理 即可判断两个点是否在同一棵树上

4、cut操作 将树分开变成两半 首先我需要先将两个点连接到同一个链(splay)上 然后再把其中一个节点转到splay的根 然后把他和x断开即可体现在儿子数组和fa数组的清0上 注意此时splay根节点的那个点断开之后如果有维护的一些信息需要update一下

5、merge操作 合并两棵子树

首先将其中一个点换到真正的根上 然后fa[x]=y 将fa指向另一个点即可

剩下的继续补充Ing 待填坑qwq 愿保佑蒟蒻我因为处在tj幸运的获得thuwc的机会的这次旅行不要死的太惨

你可能感兴趣的:(lct)