Link_Cut_Tree
LCT就是动态树的一种,但是相比Top_Tree来说,处理子树能力不足(但是简单)。 LCT利用轻重路径的划分,也就是实边和虚边来实现边的删除和合并。 现在来说说LCT的几个重要操作:(默认会splay) access(x) : 让x连到根上面,也就是让根到x的边全部变为实边。所以我们每次让当前节点splay到根,改变儿子,向上pushup传递信息即可。 makeroot(x) : 让x为根,也就是换根操作,我们先access(x),之后x肯定为深度最大的点,然后splay到根即可。 find(x) : 找到原树的根,也是一样,我们先access(x) ,之后把根换到最底层,也就是把x,splay到顶点,然后一直向左儿子走即可走到原根。 split(x,y) :向然x为根,即makeroot(x),之后打通y到x的路径,access(y),然后把y,splay到根即可得到以y为根,x到y的路径。 link(x,y) :连接x,y两个点(变成实边),我们令x为根,如果y的根不为x就让x的父亲为y即可。 cut(x,y) :切断x,y两点之间的边,先让x为根,如果满足y的父亲,y的根都为x且y没有左儿子,切断即可。 例题: Link_Cut_Tree例题 AC代码: # pragma GCC optimize(2) # include <bits/stdc++.h> //#define