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

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

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

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

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

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

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

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

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

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

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

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

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

……

好吧,由于某些神犇也不知道的原因,如果不用\(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\)上的前驱.

待更\(……\)

浅谈$\mathcal{LCT}$初步使用及具体操作的更多相关文章

  1. 浅谈配置chrome浏览器允许跨域操作的方法

    浅谈配置chrome浏览器允许跨域操作的方法 一:(Lying人生感悟.可忽略) 最近有一天,对着镜子,发现满脸疲惫.脸色蜡黄.头发蓬松.眼神空洞,于是痛诉着说生活的不如意,工作没激情,工资不高,一个 ...

  2. MVC模式浅谈

    MVC模式浅谈 一.MVC模式概述 模型-视图-控制器(MVC模式)是一种非常经典的软件架构模式,在UI框架和UI设计思路中扮演着非常重要的角色.从设计模式的角度来看,MVC模式是 一种复合模式,它将 ...

  3. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  4. Spring缓存框架原理浅谈

    运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...

  5. android assets文件夹浅谈

    ---恢复内容开始--- 最近在研究assets文件夹的一些属性跟使用方法.根据网上一些文章.实例做一下汇总,拿出来跟大家分享下,有不足的地方还请多多指教. 首先了解一下assets是干什么用的,as ...

  6. jsp内置对象浅谈

    jsp内置对象浅谈 | 浏览:1184 | 更新:2013-12-11 16:01 JSP内置对象:我们在使用JSP进行页面编程时可以直接使用而不需自己创建的一些Web容器已为用户创建好的JSP内置对 ...

  7. Android性能优化的浅谈

    一.概要: 本文主要以Android的渲染机制.UI优化.多线程的处理.缓存处理.电量优化以及代码规范等几方面来简述Android的性能优化 二.渲染机制的优化: 大多数用户感知到的卡顿等性能问题的最 ...

  8. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  9. javascript数组浅谈2

    上次说了数组元素的增删,的这次说说数组的一些操作方法 join()方法: ,,] arr.join("_") //1_2_3 join方法会返回一个由数组中每个值的字符串形式拼接而 ...

  10. javascript数组浅谈1

    最近心血来潮要开始玩博客了,刚好也在看数组这块内容,第一篇就只好拿数组开刀了,自己总结的,有什么不对的地方还请批评指正,还有什么没写到的方面也可以提出来我进行完善,谢谢~~ 首先,大概说说数组的基本用 ...

随机推荐

  1. python字符串拼接方式

    一 .join(iterator),后面必须是可迭代对象,例如:字符串,列表,元组 testList = ["1","2"] print(",&quo ...

  2. mysql 8/oracle 登录失败处理,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施

    1 mysql 8 先安装密码插件 install plugin CONNECTION_CONTROL soname 'connection_control.so';install plugin CO ...

  3. server2008R2 安装.net framework 4.7 4.8 时间戳签名和/或证书无法验证或格式错误

    安装补丁 KB4474419 和KB4490628 实测有效 补丁下载: https://www.catalog.update.microsoft.com/Search.aspx?q=4474419 ...

  4. Python turtle print TaiChi

    import turtle turtle.pensize(20) turtle.pencolor("black") turtle.penup() turtle.goto(0,300 ...

  5. C++ 函数与数组

    C++ 函数与数组 #include<iostream> using namespace std; const int ArSize = 8; int sum_arr(int arr[], ...

  6. python 函数默认值误区

    当创建python函数时,默认值参数实在执行def语句的时候创建的也即是在创建该函数的时候,而不是在调用该函数的时候创建的. def append(x, lst = []): lst.append(x ...

  7. 关于git错误:Git未能顺利结束(退出码 128)的解决办法

    如图: 问题原因: 主要是:用户名.邮箱.用户密钥跟github官网上配置的不一致 https://blog.csdn.net/weixin_52517585/article/details/1269 ...

  8. Pycharm 2021.3 的激活破解教程,永久激活,亲测有效

    关注公众号回复 pycharm 即可获取激活脚本和教程 更新时间 2022年1月20日. 不定时更新 激活码可在公众号中回复[激活码]获取.

  9. js两个数组对象合并去重

  10. linux 学习之awk

    awk 笔记 awk可以截取列 如 ll | awk '{print $3}' 获取第三列内容 参数 -F 指定分隔符 如 ls | wak -F "." '{print $1}' ...