史上最详尽的LCT讲解
来源:互联网 发布:java socket 聊天室 编辑:程序博客网 时间:2024/04/30 09:08
引子
—–摘自PoPoQQQ&&优秀的学姐
『LCT能干嘛』
(1)维护一个序列,支持下列操作:
区间求和
区间求最值
区间修改
求连续子段和
这个线段树就可以解决 具体做法不加累述了
(2)维护一个序列,支持下列操作:
区间求和
区间求最值
区间修改
求连续子段和
添加一段区间
删除一段区间
翻转一段区间
Splay的基本操作
(3)维护一棵树,支持下列操作:
链上求和
链上求最值
链上修改
子树修改
子树求和
树链剖分!!!
(4)维护一棵树,支持下列操作:
链上求和
链上求最值
链上修改
断开树上的一条边
连接两个点,保证连接后仍然是一棵树
由于树是动态的,我们不能每次操作都重标号一遍 树链剖分搞不了了
然而我们可以沿用树链剖分的轻重链剖分的概念
既然是动态那么我们肯定要把静态的线段树换成动态的Splay
于是就有LCT≈树链剖分+Splay
『引入一些概念』
Preferred Child:重儿子,重儿子与父亲节点同在一棵Splay中,一个节点最多只能有一个重儿子
Preferred Edge:重边,连接父亲节点和重儿子的边
Preferred Path:重链,由重边及重边连接的节点构成的链
『Auxiliary Tree(辅助树)』
由一条重链上的所有节点所构成的Splay称作这条链的辅助树
每个点的键值为这个点的深度
辅助树的根节点的父亲指向链顶的父亲节点,然而链顶的父亲节点的儿子并不指向辅助树的根节点
(儿子认爹&&爹不认儿子)
原树中的重链 -> 辅助树中两个节点位于同一棵Splay中
原树中的轻链 -> 辅助树中子节点所在Splay的根节点的father指向其父节点
注意原树与辅助树的结构并不相同
那么切入正题咯
那么LCT中最重要的操作可以说是….
『Access操作』
目的:将x的重边切断,并将x到根的路径上所有的边都搞成重边。
具体实现:根据辅助树按照深度为关键字的性质。不断地将一个结点的父亲转到根,然后把这个结点接到它父亲的右儿子,此时要切断x下面的所有重边
『Reverse操作』
目的:将原树中的x结点转到根。
具体实现:因为原树是虚树,所以在原树中进行变换实际上是在辅助树中进行变换。首先Access一个点,再将这个点在辅助树中转到根。又是根据辅助树按照深度为关键字的性质,将这个点所在的splay树反转,实际上改变了深度的关系,也就是实现的原树的换根。
那么知道这两个之后其他的都是小菜咯
『Link操作』
目的:将两个不连通的点连通。换句话来说,合并或扔到一颗树里。
具体实现:首先进行Reverse操作,在原树中将一个点转到那个点所在的树的根。然后将这个转到根的点的father接到另外一个点上。可以进行一次splay来update。
『Cut操作』
目的:将两个连通的点不连通,换句话说,把一棵树拆成两棵树。
具体实现:首先进行Reverse操作,在原树中将一个点转到那个点所在的树的根。然后Access另外一个点,把另外一个点在辅助树中转到根。由于这两个点原先是连通的,那么进行Access操作之后两个点在辅助树中一定是一个位于根,一个位于根的左儿子(深度)。所以在辅助树中把这个边砍掉就行了。
『Find操作』
目的:寻找一个点在原树中的根。
用于:判断两个点的连通性。
具体实现:首先Access这个点,然后在辅助树中将这个点转到根,由于辅助树按照深度为关键字排序,所以不断地向左子树寻找,就可以找到深度最小的根。
差不多就这些啦,还有一些奇怪的求和啊,维护最大值最小值什么的和线段树平衡树等数据结构基本一样。也难怪,LCT其实就是线段树、平衡树的延伸。
以后的题目训练博主会渐渐发到blog里哦,期望资瓷!
- 史上最详尽的LCT讲解
- 史上最详尽的平衡树(splay)讲解与模板
- 史上最详尽的平衡树(splay)讲解与模板
- LCT 讲解 动态树的基本使用
- 对Android的Activity生命周期非常详尽的讲解!!
- 史上最详尽平衡树(splay树)讲解
- 计算机字符编码详尽讲解
- 计算机字符编码详尽讲解
- LCT模板及详细讲解
- 史上最详尽的git图文教程,包学包会
- 莫队算法讲解 (详尽版)
- VIVIBootLoaderStep1的详尽分析
- 详尽的IPC$资料
- sizeof的详尽用法
- LCT维护子树信息(子树信息LCT) LCT维护边权(边权LCT) 知识点讲解
- 史上最详尽tablayout使用
- LCT的初步理解
- LCT的扩展操作
- 猜数字游戏,水仙花数
- python slice的几个小点总结
- 任务调度SpringTask
- JAVA SE — Day 15
- 架构师之路:Java从零到企业级电商项目实战服务端
- 史上最详尽的LCT讲解
- Java第三天
- 伽利略解析
- telnet 模拟http请求
- vs2013配置opencv3.3.0
- 解构赋值的原理
- Android getevent/sendevent/input使用方法
- 浅谈C语言操作符
- 【Flashback】Flashback Database闪回数据库功能实践