\(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. HTTP-看这一篇就够了

    HTTP和HTTPS有什么区别 1.传输过程中信息是否加密,HTTP是超文本传输协议,信息是明文传输,HTTPS是具有安全性的SSL加密的超文本传输协议,信息是加密传输: 2.服务端使用的端口号不一致 ...

  2. Ubuntu linux下gcc、g++不同版本的安装和切换

    讲解linux下gcc.g++不同版本的安装和切换 Ubuntu 18.04预装GCC版本为7.3,但有时在编译是需要用的不同gcc版本,下面介绍,如何安装不同的gcc 和g++,并设置根据不同的需要 ...

  3. 基础框架SSM导学

    SSM Spring SpringMVC Maven高级 SpringBoot MybatisPlus spring官网:http://spring.io

  4. window安装nginx,并解决前端跨域问题

    window 安装 nginx 流程 第一步:下载nginx http://nginx.org/en/download.html 第二步:下载完成后,解压到指定目录文件,启动nginx 进入nginx ...

  5. Spring系列之面向切面编程-15

    目录 AOP 概念 AOP 代理 @AspectJ 支持 启用@AspectJ 支持 使用 Java 配置启用 @AspectJ 支持 通过 XML 配置启用 @AspectJ 支持 声明一个方面 声 ...

  6. transition实现元素动画平移

    效果: 将灰色背景区域移除屏幕,并实现动画效果 代码: 使用transition属性可定义平移的时间,巧用calc得出非确定高度元素的平移距离

  7. 本地mysql端口3306 一直干不掉这样解决

    第一步:先whereis   mysql(查找到MySQL的一些本地文件) 主要删除这两个   再干掉端口3306  即可

  8. setter注入--简单类型

    UserDaoImpl中的代码,实现对name和age的注入 private String name; private int age; public void setName(String name ...

  9. DNS服务学习笔记

    1.基本概念 ​ DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与IP地址的解析服务. ​ DNS是一个分布式数据库,命名系统采用层次的逻辑 ...

  10. fgets()函数的详解以及使用时需要注意的一些细节-C语言基础

    这篇文章要探讨的是"fgets()函数的详解以及使用时需要注意的一些细节".涉及fgets()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). fgets()(函数原型: ...