900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 史上最详尽的LCT讲解

史上最详尽的LCT讲解

时间:2022-08-04 16:32:19

相关推荐

史上最详尽的LCT讲解

引子

—–摘自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里哦,期望资瓷!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。