LCT学习笔记
LCT学习笔记
LCT,(Link Cut Tree) ,是一种动态树,维护的是森林。可以维护作有两点连通性,两点路径权值和,连接两点和切断某条边、修改信息等。
LCT是用Splay来维护的。每颗Splay维护的是原森林中的一条路径。
- 性质一:Splay还要维护一个性质,那就是每颗Splay的中序遍历是原树中的一条从上到下的路径。(也就是深度递增的序列)再具体来说,Splay中的每个节点,左儿子是他的父亲,右儿子是他的儿子,如果他是父亲的左儿子,那他就是深度更深的节点(并不一定是直接的)。
而Splay是用实链剖分来划分的。也就是每个点向他的某个儿子连实边,向其它的儿子连虚边。
- 性质二:每颗Splay并不是独立的,每颗Splay的根节点指向原树中这条链的父亲节点(即原树中这条链的最顶端的父亲节点)。需要注意的是,这连接的是虚边。
算了,不说这么多,我也不太理解,直接讲代码把。
Code
应用
LCT求LCA
虽然感觉有点大材小用了,但LCT确实是可以求LCA的,而且还可以求动态的LCA。即可以支持动态加边,换根等LCT本生支持的操作。
其他的操作都保存,唯一要加的就是一个求LCA的函数。
我们先将 x 和根节点连起来。然后显然,y和x的LCA一定在x到根节点的这条实链上。我们保存access的操作,最后一个连向的节点,就是他们相交的节点,就是他们的LCA。
复杂度的话,LCT的常数显然是很大的,测试后大概跟倍增的常数(实现比较优秀的倍增)一致,是树剖的一半。
码量不长,但是绝对算不上好调。平时还是没有太大必要写的。
维护链信息(LCT上的线段树操作)
P1501 [国家集训队] Tree II
支持的操作:加边,删边,链上加,链上乘,链上求和。
还记得LCT的
唯一跟普通LCT相比需要修改的就是
P3203 [HNOI2010] 弹飞绵羊
弹力系数可以看做一条边,答案就是走到外面的点的边数。
考虑建立一个 n+1 号节点,答案就是从那条边就到 n+1 号节点的边数。
显然可以先把 n+1 号点到 i 号节点的边扒出来。答案就是这条路径的长度。这就很简单了。
动态维护连通性&双联通分量
P3950 部落冲突
就是随便判一下连通性就好。判断一下根是不是就好。
维护链上的边权信息(生成树)
维护子树信息
P4219 [BJOI2014] 大融合
一条边的贡献很好求,就是他们的子树大小相乘。
所以问题就变成了求动态加边的情况下求子树大小。
这就需要维护子树信息的LCT了。
因为还有虚子树的存在,所以我们需要维护一个虚子树的信息。
设原子树的信息为
考虑什么时候会改变边的虚实关系。
发现在 access
操作的时候会修改一个点的右儿子。这是我们就需要对他的
然后就是在加边的时候也会影响到一个点的虚实关系。 link(x,y)
的话会使得
然后其他的操作就跟普通的 LCT 一致就好。
维护树上染色联通块
特殊题型
__EOF__

本文链接:https://www.cnblogs.com/shadom/p/17824367.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析