【总结】Link-Cut Tree
这是一篇关于LCT的总结
加删边的好朋友——Link Cut Tree
Link-Cut Tree,LCT的全称
可以说是从树剖引出的问题
树剖可以解决静态的修改或查询树的链上信息;那如果图会不断改变,怎么办?
然后就有了LCT(真不知道发明它和它的那些拓展用法的人是怎么想出来的,创造力真强)
LCT要做的就是在不断的加边、删边等等改变图的操作中维护树的信息
不得不说,它很强大
本篇随笔只是记录一下自己对使用LCT的心得,如果你想从头开始学习LCT,可以去这里—— LCT总结+题单+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
什么时候需要LCT?
一般情况下,如果题目中有加/删边的操作,那就套LCT进去,然后思考怎么用LCT完成其余的操作
不过真正的好题是完全看不出要用LCT的,所以更好的方法是先想到算法,然后用LCT维护算法中支持LCT维护的东西(数据结构其实本应这样用)
LCT的强大的操作们
动态维护树中的联通性
这是最简单的操作了,该link的link,该cut的cut,询问的时候,两个点都findroot一下,相同的话就是联通的,反之不联通
动态维护树的链上信息
这个也算是基本操作了,要找一条 \(u\) 到 \(v\) 的链,就先把 \(u\) makeroot到根,然后access一下 \(v\) (其实就是split),Splay维护好要维护的信息就行
动态维护图的生成树
这里开始就变成图了,不再单纯是树了
有时从题目中发现性质是要动态维护图的最大/小生成树(什么是动态?就是要维护正确性,那么在一个条件下,只有一些边在图中,其它的边不能够连)
其实就是四个字,化边为点
把原图的每一条边看成是一个点,那么 \(u\) 连到 \(v\) ,就变成了 \(u\) 连到了 \(s\) , \(s\) 再连到 \(v\) ,然后边权存在那条边化为的点上,其他的原图中真正的点对应的点没有点权,这样一条边如果加入了,那么它在Splay中就会有自己的贡献,如果要删掉,就断开它化为的点与这条边两端的点,自然就不会有它的答案计入
动态维护图的边双
这个东西算是比较玄学的了
加边的时候,发现这条边的两端如果已经联通,那么这条边加入后就一定会形成一个环,那么这个环里的所有点就处在一个边双里
怎么维护?
用另一个点表示这个边双(所有边双都新开一个点来表示),如果发现环,就把这个环里的所有点的父亲指向新点(一个dfs搞定),表示这些点已经归于一个边双了,然后这之中的所有点的操作都由新点代理进行,是不是很类似缩点,其实它就是缩点
很玄学,多看代码
动态维护树的子树信息
又回到树了,但是这也是最玄的
LCT是把一条链变成一个Splay,所以无论怎么搞,LCT里最终维护都是一条链上的信息,那如果题目要维护原树的子树信息,又要动态加边、删边怎么办?
那不随便,不管,还是LCT
注意LCT的构造,原树中一个节点的儿子(除实儿子)在LCT中一定是这个节点的虚儿子,那么如果要知道这个节点的原树信息,就是原树中的实儿子信息加虚儿子信息,实儿子信息LCT本身可以维护;那就只要知道虚儿子信息怎么维护。
这个还是简单的,一个数组搞定。LCT虽然一个节点只认一个儿子,但它的所有儿子都是认它的。所以对于儿子,把自己的信息加到父亲上去就搞定了
可以看看链接的博客,这一段讲得比较清楚
这个维护子树信息真的搞不透,有时候维护的东西从哪里取出来都不知道,我还是太菜了
一些套路
LCT能有什么套路
但还是有几个的
- 能用并查集维护连通性的时候尽量用并查集,因为findroot太慢(只有加边的时候可以用并查集)
- 对于一些题目,要维护生成树,但是要删边。而LCT维护生成树做不到把非树边代替树边。那么就离线倒过来做,从后往前,时光倒流(形容的很好),就变成只有加边了
好想我就只知道这么多了,我还是太菜了
一些练习题
为了暂时性的用好LCT,于是做了少许题目
大概是从简到难吧(不好排序),一类操作大部分在一起
- 【刷题】BZOJ 2049 [Sdoi2008]Cave 洞穴勘测(最简单的,模板判联通性)
- 【刷题】洛谷 P3950 部落冲突(化边为点,维护联通性)
- 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)(裸题,上模板)
- 【刷题】洛谷 P1501 [国家集训队]Tree II(维护链上信息,练习打lazy标记)
- 【刷题】BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊(有趣的转化,维护链上size)
- 【刷题】BZOJ 2816 [ZJOI2012]网络(暴力处理染色联通块,LCT维护链上最大值)
- 【刷题】BZOJ 1036 [ZJOI2008]树的统计Count(维护sum与max)
- 【刷题】BZOJ 1180 [CROATIAN2009]OTOCI(维护联通性与权值和,还是链)
- 【刷题】BZOJ 2157 旅游(维护链)
- 【刷题】BZOJ 2243 [SDOI2011]染色(高级一点的pushup)
- 【刷题】BZOJ 3626 [LNOI2014]LCA(差分,答案的转化和标记很重要)
- 【刷题】BZOJ 4817 [Sdoi2017]树点涂色(有点恶心的两个数据结构,还有差分)
- 【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版(维护生成树练手题)
- 【刷题】BZOJ 3669 [Noi2014]魔法森林(维护生成树,枚举一维,LCT一维)
- 【刷题】UOJ #274 【清华集训2016】温暖会指引我们前行(其实是维护最大生成树的裸题)
- 【刷题】洛谷 P4234 最小差值生成树(与魔法森林相似)
- 【刷题】BZOJ 1977 [BeiJing2010组队]次小生成树 Tree(新的生成树)
- 【刷题】BZOJ 4998 星球联盟(维护边双的来了)
- 【刷题】BZOJ 1969 [Ahoi2005]LANE 航线规划(边双)
- 【刷题】BZOJ 2959 长跑(还是边双,都很裸,几乎就是一样的)
- 【刷题】COGS 2701 动态树(维护子树信息的练手题)
- 【刷题】BZOJ 4530 [Bjoi2014]大融合(维护子树size)
- 【刷题】UOJ #207 共价大爷游长沙(维护子树异或和,巧妙的思维与构思,膜拜毛爷爷)
接下来的题目就有一定难度了
- 【刷题】BZOJ 3514 Codechef MARCH14 GERALD07加强版(一开始根本不知道有这样的性质)
- 【刷题】洛谷 P3613 睡觉困难综合征(
症?征LCT加上贪心) - 【刷题】BZOJ 4825 [Hnoi2017]单旋(用一种数据结构维护另一种数据结构,性质发现很重要啊)
- 【刷题】BZOJ 4025 二分图(动态图问题来了)
- 【刷题】BZOJ 1453 [Wc]Dface双面棋盘(还是动态图,都要离线)
- 【刷题】BZOJ 4573 [Zjoi2016]大森林(虚点的建立很精髓)
- 【刷题】洛谷 P4319 变化的道路(线段树与LCT)
正好30道,还有一些没做
因为省选来了,所以暂时放下(省选很虚啊,我还是太菜了)
从未结束
从此,LCT的学习告一段落
倒计时,大后天
【总结】Link-Cut Tree的更多相关文章
- link cut tree 入门
鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...
- Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...
- Link/cut Tree
Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...
- 洛谷P3690 Link Cut Tree (模板)
Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门
link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...
- P3690 【模板】Link Cut Tree (动态树)
P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...
- Link Cut Tree学习笔记
从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...
- [CodeForces - 614A] A - Link/Cut Tree
A - Link/Cut Tree Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, ...
- Link Cut Tree 总结
Link-Cut-Tree Tags:数据结构 ##更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1027479 一.概述 \(LCT\),动态树的一种,又可以 ...
随机推荐
- string[]转换为int[]
今天碰到一个问题,要把string[]转换为int[],但是又不想使用循环转换,找了好久最后找到了这种方法,特此记录下. string[] input = { "1", " ...
- 向大学说拜拜——大学 > 兴趣 + 时间 + 思考 + 实践
[人物素描] 大学期间,担任过班委,加入过学生会,参加过社团,拿过奖学金......而印象最深刻的莫过于参加并组织过ACM集训,以及参加过导师的国家自然科学基金项目了.毕业时顺利拿到一波offer,并 ...
- SpringBoot (1) idea下的环境搭建及demo
1.Spring Boot简介 wiki上的介绍: Spring Boot是Spring的常规配置解决方案,用于创建可以“运行”的独立的,生产级的基于Spring的应用程序.[22]它预先配置了Spr ...
- 韦大仙--LoadRunner压力测试:详细操作流程
一. 录制脚本 1.安装完毕后,创建脚本: 点击OK之后,会弹出网址,之后创建Action,每进一个页面添加一个Action,录制结束后,终止录制. 二. 修改脚本 1.脚本参数化 将登录的用户名密码 ...
- 003--MySQL 数据库事务
什么是事务? 事务是一组原子性的 SQL 查询, 或者说是一个独立的工作单元. 在事务内的语句, 要么全部执行成功, 要么全部执行失败. 事务的 ACID 性质 数据库事务拥有以下四个特性, 即 AC ...
- Vue-lazyload 的使用
Vue 项目使用 Vue-lazyload 做图片懒加载. 下载 下载 Vue-lazyload 的包NPM包 npm install vue-lazyload --save 引入 在项目 main. ...
- Java:重写equals()和hashCode()
Java:重写equals()和hashCode() 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instan ...
- ES6的新特性(17)——Generator 函数的异步应用
Generator 函数的异步应用 异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Gener ...
- Alpha版发布 - 感谢有你们
在本次alpha开发的过程中,很感谢组长王航对我信任,让我统筹大家的工作任务和进度,使我对项目管理有了深刻的理解. 我也要感谢邹双黛,因为我以前很少做文字类的工作,写东西非常生硬,邹双黛即使在有做家教 ...
- Java 学习笔记 ------第二章 从JDK到IDE
本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...