蒟蒻的LCT解读(1)

  前段时间本蒟蒻自学了一下LCT,但是网上的很多资料并不很全,而且作为一个数组选手,我看指针代码真的很麻烦,所以就在这里写一篇数组选手能看懂的代码。

LCT的初步了解

LCT全称Link_Cut_Tree,中文名动态树,Tarjan大爷的发明专利。

动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作。其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT(link-cut tree)。

  LCT的大体思想类似于树链剖分中的轻重链剖分,轻重链剖分是处理出重链来。由于重链的定义和树链剖分是处理静态树所限,重链不会变化,变化的只是重链上的边或点的权值,由于这个性质,我们用线段树来维护树链剖分中的重链,但是LCT解决的是动态树问题(包含静态树),所以需要用更灵活的splay来维护这里的“重链”。

  看完之后我们知道,LCT和静态的树链剖分很像。怎么说呢?这两种树形结构都是由若干条长度不等的“重链”和“轻边”构成(名字可以不同,大概就是这个意思),“重链”之间由”轻边”连接。就像这样:

  

  较粗的就是重边。

与树链剖分的不同:

看到这里,我想很多人会问,那写树链剖分不就好了,写什么LCT呀!

  LCT和树链剖分不同的是,树链剖分的链是不会变化的,所以可以很方便的用线段树维护。但是,既然是动态树,那么树的结构形态将会发生改变,所以我们要用更加灵活的维护区间的结构来对链进行维护,不难想到Splay可以胜任。如何分离树链也是保证时间效率的关键(链的数量和长度要平衡),树链剖分的“重儿子”就体现了前人博大精深的智慧。

  在这里解释一下为什么要把树砍成一条条的链:我们可以在logn的时间内维护长度为n的区间(链),所以这样可以极大的提高树上操作的时间效率。在树链剖分中,我们把一条条链放到线段树上维护。但是LCT中,由于树的形态变化,所以用能够支持合并、分离、翻转等操作的Splay维护LCT的重链(注意,单独一个节点也算是一条重链)。

  这时我们注意到,LCT中的轻边信息变得无法维护。为什么呢?因为Splay只维护了重链,没有维护重链之间的轻边;而LCT中甚至连根都可以不停的变化,所以也没法用点权表示它父边的边权(父亲在变化)。所以,如果在LCT中要维护边上信息,个人认为最方便的方法应该是把边变成一个新点和两条边。这样可以把边权的信息变成点权维护,同时为了不影响,把真正的树上节点的点权变成0,就可以用维护点的方式维护边。

关于一些定义:

struct link_cut_tree {
int father;//父亲节点
int ch[2];//左右儿子
bool reverse;//区间反转标记
bool is_root;//是不是所在splay的根
}tree[maxn];

最新文章

  1. mysql在空闲8小时之后会断开连接(默认情况)
  2. Aspose.Cells 导出 excel
  3. MiniUI动态添加table表格
  4. cmd的xcopy命令
  5. AVA取整以及四舍五入
  6. Ghost win7 系统安装(虚拟机)
  7. MVC理解
  8. 在Windows平台搭建轻巧的Python开发环境——面向工程和科研的扩展包配置
  9. AspNetCore-MVC实战系列(四)之结尾
  10. spring cloud sidecar
  11. Java线程和守护进程
  12. bzoj 4832 抵制克苏恩 概率期望dp
  13. [PHP] 算法-字符串的左循环的PHP实现
  14. 20171022xlVBA练手提取入所记录
  15. defaultProps和propTypes
  16. git 下载指定tag版本的源码
  17. How to delete deployed process definition in activiti?
  18. 【Spark】SparkStreaming-高可用-HA-Master
  19. Definitaion of 'utsname' must be imported from module 'Darwin.POSIX.sys.utsname' before it is required
  20. Java设计模式(7)装饰模式(Decorator模式)

热门文章

  1. 遇到问题---java---@value注解为null
  2. 简短的创建Ajax对象代码
  3. SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛 D. 白色相簿
  4. Android 蓝牙模块基础操作
  5. freemark的常用方法
  6. golang 安装一个项目下的所有依赖
  7. golang interface 类型变量当作某个具体类型使用
  8. 十、Shell基础
  9. Qt ------ QWidget 自定义子类使用信号与槽(Q_OBJECT)后 stylesheet 失效
  10. django中django.conf.urls.url函数