LCT算法介绍
Part 1:introdution
LCT是个啥?
LCT是一种强大的数据结构,可以维护动态森林,也就是对于加点,删点的情况也可以处理树,使其复杂度仍为
它的本质是:实链剖分。它与重链剖分有一定的相似,但功能更强。
既然是实,那么就说明它对于变化的情况可以自适应的剖。
在实链剖分的基础下,LCT可以支持更多的操作:
·查询、修改链上的信息(最值,总和等)
·随意指定原树的根(即换根)
·动态连边、删边
·合并两棵树、分离一棵树
·动态维护连通性
Part 2:算法讲解。
前置芝士:
对于同一条链(满足深度递增)用
具体而言,这个
核心:
对于一个点
首先将
然后,来到这条链的父亲,将这条链与父亲的连接”“打通”,同时也需将父亲的更深节点“自立门户”。
这样递归进行直至到根。
上图:
(途中标黑的边为链)
进行断边:
进行连边:
这样就完成了。
代码其实很短,可以自行写一下。
复杂度分析:
每次剖时相当于在到根的链上做
累加势能,相当于在一颗
分操作:
-
makeroot
可以将一个点
操作:先执行一次
发现每条链只认它的父亲,也就是说,对于除了该链上的链无需操作。
只需将
-
split
可以将两个点
操作:先将
-
findroot
可以查询
操作:先
操作完后还要将
(其实可以发现,有关链的操作在最后都要进行
-
cut
可以删去
操作: 先
那么删除一切的父子关系即可。
-
link
可以连边
操作: 先
否则将