浅谈$\mathcal{LCT}$初步使用及具体操作
\(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\)管控的是一对分散的点,点以几棵分散的splaysplay的形式聚集。起初整棵LCTLCT是没有任何联系的,各自为战,各自为根。我们接下来会看到的\(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}$初步使用及具体操作的更多相关文章
- 浅谈配置chrome浏览器允许跨域操作的方法
浅谈配置chrome浏览器允许跨域操作的方法 一:(Lying人生感悟.可忽略) 最近有一天,对着镜子,发现满脸疲惫.脸色蜡黄.头发蓬松.眼神空洞,于是痛诉着说生活的不如意,工作没激情,工资不高,一个 ...
- MVC模式浅谈
MVC模式浅谈 一.MVC模式概述 模型-视图-控制器(MVC模式)是一种非常经典的软件架构模式,在UI框架和UI设计思路中扮演着非常重要的角色.从设计模式的角度来看,MVC模式是 一种复合模式,它将 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- Spring缓存框架原理浅谈
运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...
- android assets文件夹浅谈
---恢复内容开始--- 最近在研究assets文件夹的一些属性跟使用方法.根据网上一些文章.实例做一下汇总,拿出来跟大家分享下,有不足的地方还请多多指教. 首先了解一下assets是干什么用的,as ...
- jsp内置对象浅谈
jsp内置对象浅谈 | 浏览:1184 | 更新:2013-12-11 16:01 JSP内置对象:我们在使用JSP进行页面编程时可以直接使用而不需自己创建的一些Web容器已为用户创建好的JSP内置对 ...
- Android性能优化的浅谈
一.概要: 本文主要以Android的渲染机制.UI优化.多线程的处理.缓存处理.电量优化以及代码规范等几方面来简述Android的性能优化 二.渲染机制的优化: 大多数用户感知到的卡顿等性能问题的最 ...
- .net中对象序列化技术浅谈
.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...
- javascript数组浅谈2
上次说了数组元素的增删,的这次说说数组的一些操作方法 join()方法: ,,] arr.join("_") //1_2_3 join方法会返回一个由数组中每个值的字符串形式拼接而 ...
- javascript数组浅谈1
最近心血来潮要开始玩博客了,刚好也在看数组这块内容,第一篇就只好拿数组开刀了,自己总结的,有什么不对的地方还请批评指正,还有什么没写到的方面也可以提出来我进行完善,谢谢~~ 首先,大概说说数组的基本用 ...
随机推荐
- bootstrapTable insertRow 新增行保留原数据
思路:保留原数据,然后新增行. var optionsxx = {//省略xxx: columns: [{ checkbox: true}, { field: 'id', title: '主键', c ...
- windows jetbrains toolbox 无法修改应用安装目录(应用正在运行)的解决方案
打开 jetbrains toolbook安装目录/.settings.json 添加一行 "install_location": 指定的路径地址 解决方案来自 JetBrains ...
- 基础框架SSM导学
SSM Spring SpringMVC Maven高级 SpringBoot MybatisPlus spring官网:http://spring.io
- 使用 nvm 管理 node.js 版本
简介 在实际的前端开发过程中,可能会经常遇见 node.js 的版本问题,不同的项目需要使用不同的 node.js 版本. 直接安装的话,只能安装和使用 node.js 的一个版本.可以使用 nvm ...
- Derivative of the Sigmoid function
一个详细介绍怎么推导Derivative of the Sigmoid function的文章- https://towardsdatascience.com/derivative-of-the-si ...
- EXCEL之VLOOKUP函数——查找、分组、排序
1,VLOOKUP查找 新建excel,输入测试数据,F列打乱A顺序,查找他们各自对应的学号 选中目标单元格(此处是G2),点击插入函数: 选择VLOOKUP: 我们要查找F列在A列对应的学号,所以G ...
- Java常用几种加密算法(四种)
Java常用几种加密算法(四种) HChan 万丈红尘三杯酒,千秋大业一壶茶. 3 人赞同了该文章 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RF ...
- UG二次开发-内存访问违例
在项目中修改路径参数后重算发生了内存访问违例的错误,经过调试,发现是下面这一行出的错 surfaceContourBuilder1.Commit(); 经过反复调试,发现这个东西不能随便放,不可以想当 ...
- 1022 Digital Library (30分)
本题题意很好读,看上去也不难写 写完运行才发现输出title只有一个单词... 后来把cin >> t换成了getline(cin, t) 还有一个坑点: Line #1: the 7-d ...
- liunx 目录详解
/etc/sysconfig/network-scripts/ifcfg-eth0 第一块网卡的配置文件 /etc/sysconfig/network 主机名配置文件 /etc/profile ...