浅谈$\mathcal{LCT}$初步使用及具体操作

\(0x01\) 闲话 · \(LCT\)的用途以及具体思路

\(LCT\)是啥?百度一下的话……貌似是一种检查妇科病的东西?Oier的口味可是真不一般啊

咳,其实在我最近只是浅浅地学了一部分的基础上,窝觉得\(LCT\)其实就是一个用来维护森林连通性的。

嗯……因为其独特的性质所以也可以顺便维护好多东西,什么链上的最大值啊,链上的权值和啊……都可以维护——或者说,\(LCT\)是更加全能的树剖。

但其实吧……\(LCT\)打板子是很简单的,但是真正理解却一点儿也不简单。

因为本身\(splay\)就很麻烦了,况且\(splay\)之前一直用于维护数列。

要知道,此处的\(splay\)可是作为辅助树,维护一整个森林,并且可以支持序列中几乎全部操作——这就大大增高了理解难度。举个例子,你曾经认为已经难以理解、或者说不可以做的、比较复杂的区间翻转\(Luogu3391\),在\(LCT\)里面有十分全面的涉及,但是被精简到了只有两行是用来描述这个内容的。

显而易见的是,\(LCT\)虽然常数十分的大,但代码十分的短,比一棵完整的平衡树短了不少(亲测\(50+\)行),与\(FFT\)(快速傅里叶变换)一样具有着华丽的可观赏性,但是隐藏在之后的思维难度同样不可小觑。

也就是说我们是不是学的太草率、太浮躁了呢?快餐式地学完\(LCT\),网上的每一篇博客都包教包会。

但是我今天要整理的,是对于\(LCT\)真正的理解。希望各位看到这篇拙作的人可以获得一些什么。

\(0x02\) 闲话 · 关于\(splay\)

道理我都懂,要想动态拆删一些东西,辅助树的形态可以改变是先决条件。看上去平衡树好像是个不错的选择,但是,选哪个作为辅助树呢?后宫佳丽三千我该翻谁的牌子呢\(qwq\)

历史的重任最后落到了\(​splay\)​的身上。然后\(splay\)​他居然傲娇了:

1452231-20190219115345555-1738304455.png

……

好吧,由于某些神犇也不知道的原因,如果不用\(splay\)的话,复杂度是均摊\(O(nlog2n)\), 而用\(splay\)就可以做到均摊\(O(nlogn)\) ……但事实上,\(splay\)确实有他独特的性质,比如旋转到根啊之类的,比起其他种类的平衡树而言,更加适合\(LCT.\)

\(0x03\) \(LCT\)的思路和基础操作

一 主要思路

主要思路嘛……

****大概是基于实链剖分的操作。

朴素的树剖是重链剖分,大体上就是将整棵树的链划分为轻边和重链,运用巧妙的性质做到\(log\)级别。而遗憾的是\(LCT\)维护的是森林的连通性,所以只能采用实链剖分。

而实链剖分大体上就是把边分为虚边和实边。其中实边串联起一个联通块,同一组实边存在、且仅存在于一棵\(splay\)中。\(splay\)\(splay\)之间由虚边相连。

实链剖分的好处呢?在于实链剖分是一种动态剖分,他可以随意改变边的虚实属性。而显然,重链剖分由于有着足够的理论依据和逻辑推演,所以轻重链是难以更改,或者说,不可更改的。\(So\),实链剖分为动态树的动态打下了基础。

那么接下来我们来看一个\(​LCT\)​是如何定义的:

首先,一棵\(LCT\)​管控的是一对分散的点,点以几棵分散的splay​splay​的形式聚集。起初整棵LCT​LCT​是没有任何联系的,各自为战,各自为根。我们接下来会看到的\(access\)​、\(makeroot​\)​等操作,都是在自己的联通块儿内部进行的操作。换句话讲,\(LCT\)​维护的是有根森林,即组成森林的每个联通块都有其唯一的根。

实边串联起一个联通块,同一组实边存在、且仅存在于一棵splaysplay中。splaysplay和splaysplay之间由虚边相连。只有实边是有效的,虚边可以被认为不存在。但是两种边都没有用到显式存储,都是通过\(splay\)中的\(Son\)数组和\(Fa\)数组访问的。但虚边和实边的存储有区别:

虚边是认父不认子,即如果$Fa[x]==y$,那么$y$不存$x$这个儿子,但是$x$存$y$这个父亲。这样做是为了可以$Access$——因为其实在$Access$的子函数$splay$里,发挥作用的实际上是$Fa$指针。

实边是完整的双向存储。

\(splay\)中维护的是一条从存储上到下按在原树中深度严格递增的路径,且中序遍历\(splay\)得到的每个点的深度序列严格递增。换句话讲,一个\(splay\)里面不会出现在原联通块儿(树)中深度相同的两个点。在一棵\(splay\)中,键值就是原树中的深度。
如果\(x\)是它所在\(splay\)的最左边的点,那么它在原森林里的父亲是\(x\)所在\(splay\)的根的\(fa\), 否则就是\(x\)\(splay\)上的前驱.

待更\(……\)

转载于:https://www.cnblogs.com/sqrthyy/articles/10400128.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值