这是一篇关于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,于是做了少许题目

大概是从简到难吧(不好排序),一类操作大部分在一起

接下来的题目就有一定难度了

正好30道,还有一些没做

因为省选来了,所以暂时放下(省选很虚啊,我还是太菜了

从未结束

从此,LCT的学习告一段落

倒计时,大后天

【总结】Link-Cut Tree的更多相关文章

  1. link cut tree 入门

    鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...

  2. Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题

    A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...

  3. Link/cut Tree

    Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...

  4. 洛谷P3690 Link Cut Tree (模板)

    Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...

  5. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  6. bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门

    link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...

  7. P3690 【模板】Link Cut Tree (动态树)

    P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...

  8. Link Cut Tree学习笔记

    从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...

  9. [CodeForces - 614A] A - Link/Cut Tree

    A - Link/Cut Tree Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, ...

  10. Link Cut Tree 总结

    Link-Cut-Tree Tags:数据结构 ##更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1027479 一.概述 \(LCT\),动态树的一种,又可以 ...

随机推荐

  1. Yii2.0 Gridview为某列增加属性

    我们知道GridView组件非常方便,会自动生成数据表格.table tr td神马的全自动生成的.但是如果想定制化稍微有点难度. 比如想在某列td上应用样式. 老写法是这样的 <?= Grid ...

  2. OpenWrt架设nginx php网站

    参考 http://www.vinoca.org/2012/05/31/openwrt%E6%9E%B6%E8%AE%BEnginxphp%E7%BD%91%E7%AB%99/ 一.安装相关包 opk ...

  3. 回归Qt——写在Qt5.10发布之日

    今天偶然看到一条关于Qt5.10发布的消息,发现Qt经历了诺基亚风波之后发展得依然良好,感到很欣慰.回头看上次关注Qt技术还是2011年,那时候用Qt4.7做一个小项目,对于一个写Win32界面和MF ...

  4. 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

    作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09     据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...

  5. node项目设置环境变量

    在UNIX系统中: $ NODE_ENV=production node app 在Windows中: $ set NODE_ENV=production $ node app 这些环境变量会出现在程 ...

  6. ES6的新特性(6)——正则的扩展

    正则的扩展 RegExp 构造函数 在 ES5 中,RegExp构造函数的参数有两种情况. 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag). var regex = ne ...

  7. react native基础与入门

    react native基础与入门 一.react native 的优点 1.跨平台(一才两用) 2.低投入高回报 (开发成本低.代码复用率高) 3.性能高:拥有独立的js渲染引擎,比传统的h5+ w ...

  8. CSS中水平居中设置的几种方式

    1.行内元素: 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align:center 来实现的. <body> <div class="t ...

  9. 《C》指针

    储存单元: 不同类型的数据所占用的字节不同,上面一个长方形格子表示4个字节 变量: 变量的值,就是存储的内容.变量的名就相当于地址的名.根据变量类型分配空间:通过变量名引用变量的值,程序经过编译将变量 ...

  10. mysql 对表格加索引但原表格有重复数据

    1.把表中唯一数据搜索创建临时表,最后代替原先表. create table mmmmmm as SELECT * FROM meriadianannotation GROUP BY SeriesID ...