$LCT$维护子树信息学习笔记
\(LCT\)维护子树信息学习笔记
昨天\(FDF\)好题分享投了 \([ZJOI2018]\)历史 这题。
然后我顺势学学这个姿势。
结果调了一年。。。于是写个笔记记录一下。
基本原理
比较显然地,虽然父子关系在不断变化,但是重链与重链之间的连接是不变的。换句话说,一个点的某个虚儿子也许并不是他在原树中的某个儿子,但是这个点总和上来的信息是这整棵子树的。
所以我们定义这个点总和的信息(记为\(siz\))为总和该子树的所有信息,
然后记\(fsz\)为虚儿子的总和信息,\(val\)为单点信息。
那么可以得到信息的统计式为:
\(siz[x]=siz[ls]+siz[rs]+fsz[x]+val[x]\)
若将\(x\)做\(Splay\)到根的话,则这个点的\(siz\)就是以这条重链链顶为根的子树的信息和。
(一定把原树和\(LCT\)分开啊
而如果我们要查以某个点为根的子树信息和的话,则先将其\(Splay\)到根,
那么所求即为:\(siz[rs]+fsz[x]+val[x]\)
很简单,就是自己重儿子的所有信息加上自己的虚子树信息以及自己
这里\(siz\)的用处自己脑补一下,很显然这个信息用\(siz\)整合出来也是对的。
这就是最基本的做法了。
虚实信息维护
这个很好办,考虑虚实边的修改只会在一些情况下出现。
\(Access:\)直接做加减法维护\(fsz\)就行了。
\(Link:\)因为每次连边是连一条虚边,所以我们直接维护,要注意的是作为儿子的点要被\(Splay\)上来总和信息。
\(Cut:\)没有特别的地方,和上面一样做即可。
带单点修改
如果带修改,那么就意味着我们需要更新这个被修改点到原树树根的信息。
到树根?\(Access!\)
直接大力\(Access\)一波,每次跳一条虚边就直接做一次单点修改就行了,注意切换虚实边。
特技?
如果要求魔改\(Access?\)
那得好好研究一下它到底长啥样啊。
首先,\(Access\)中前一条重链那棵\(Splay\)的根不一定是你的原树中的那个儿子,你得一直沿着左儿子找,找到深度最小的那个才是。
这个找的复杂度应该与\(Splay\)的复杂度相当,所以不影响其复杂度。
然后呢,你想要那个儿子的子树信息怎么办?再\(Splay\)上去?
不用了,虽然前一条重链那棵\(Splay\)的根不一定是你的原树中的那个儿子,但是它确确实实总和了那棵子树的信息,所以直接调用它的信息即可。
想用\(Access\)模拟某种染色过程?
不就是有些边不能连吗?信息还是直接加加减减来维护,连边特判就行了。
那为什么历史那题要写这么久?
我菜。
所以这个还是比较简单的,毕竟目前没写到太喵的做法。
那么就这样了。
随机推荐
- leetcode-mid-array-31 three sum-NO
my code: time limited def threeSum(nums): """ :type nums: List[int] :rtype: List[L ...
- VxWorks BSP开发入门
VxWorks将所有硬件平台相关的代码封装在BSP(Board Support Package)库中,从而为应用层代码提供了独立于硬件平台和体系接口的特性. BSP库中封装了一组统一的API,包括硬件 ...
- MySQL主从复制中replicate-ignore-db replicate-wild-ignore-table的应用
MySQL主从复制中replicate-ignore-db replicate-wild-ignore-table的应用 replicate-ignore-dbreplicate-wild-ignor ...
- JSON基础,简单介绍
JSON(JavaScript Object Notation(记号.标记)) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - ...
- JVM(2) JVM内存模型
一.概述 Java的内存管理采用[自动内存管理]机制,因为这个自动管理机制,Java程序员就不需要去写释放内存的代码,而且不容易出现内存泄漏问题(比C/C++程序员少一些烦恼).但是由于内存的申请和释 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_9_Hashtable集合
是最早期的双列集合 同步就表示是单线程 value也不允许为空
- docker搭建harbor私有镜像库
创建harbor私有镜像库 一.部署准备: harbor软件包 在部署节点上: 1)解压harbor的软件包将harbor目录下所有文件发送到/opt/目录下 tar zxvf harbor- ...
- 07 oracle 归档模式 inactive/current redo log损坏修复--以及错误ORA-00600: internal error code, arguments: [2663], [0], [9710724], [0], [9711142], [], [], [], [], [], [], []
07 oracle 归档模式 inactive/current redo log损坏修复--以及错误ORA-00600: internal error code, arguments: [2663], ...
- 【SD系列】SAP 创建销售订单-用外部给号的方法步骤
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 创建销售订单-用外部给号的方 ...
- Node.js实战14:一个简单的TCP服务器。
本文,将会展示如何用Nodejs内置的net模块开发一个TCP服务器,同时模拟一个客户端,并实现客户端和服务端交互. net模块是nodejs内置的基础网络模块,通过使用net,可以创建一个简单的tc ...