$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\)模拟某种染色过程?
不就是有些边不能连吗?信息还是直接加加减减来维护,连边特判就行了。
那为什么历史那题要写这么久?
我菜。
所以这个还是比较简单的,毕竟目前没写到太喵的做法。
那么就这样了。
随机推荐
- Java语言支持的变量类型有哪几种
Java语言支持的变量类型有: 类变量:独立于方法之外的变量,用 static 修饰. 实例变量:独立于方法之外的变量,不过没有 static 修饰. 局部变量:类的方法中的变量. 实例: publi ...
- 微信小程序、SSL证书、开启服务器TSL1.0、TSL1.1、TSL1.2服务
微信小程序.SSL证书.开启服务器TSL1.0.TSL1.1.TSL1.2服务 https://blog.csdn.net/qq_32933615/article/details/70143105
- SeaJS基本开发原则
SeaJS基本开发原则在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则.使用SeaJS开发JavaScript的基本原则就是:一切皆为模块.引入SeaJS后,编写JavaScr ...
- 基于modelforms组件实现注册功能
数据库部分 使用的是auth_user表,添加r_pwd字段后表名变为UserInfo from django.db import models from django.contrib.auth.mo ...
- EntityFrameworkCore.MySql
1.点击“工具”->“NuGet包管理器”->“程序包管理器控制台” 分别安装以下几个包 Mysql 版本: Install-Package MySql.Data.EntityFramew ...
- VMware 虚拟化编程(4) — VDDK 安装
目录 目录 前文列表 VDDK 安装 VDDK 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化编程(2) - 虚拟磁盘 ...
- Jmeter之CSV Data Set Config
在很多情况下,需要针对测试数据做参数化操作,Jmeter提供了很好用的CSV Data Set Config插件. 一.界面显示 二.界面说明 1.名称:标识,建议设置为该组件是提供什么功能 2.注释 ...
- protel封装总结(新手必看)
零件封装是指实际零件焊接到电路板时所指示的外观和焊点的位置.是纯粹的空间概念.因此不同的元件可共用同一零件封装,同种元件也可有不同的零件封装.像电阻,有传统的针插式,这种元件体积较大,电路板必须钻孔才 ...
- 嗯,python
总觉得在这么个地方已经没有在碰blog的可能了...但是... 突然说要用python来配置环境...好歹也是这个专业的啊...还是 看看吧... 然后 百度一搜,看到一个 好的 网站,不知道 我一旦 ...
- Spring Boot 之 RabbitMQ 消息队列中间件的三种模式
开门见山(文末附有消息队列的几个基本概念) 1.直接模式( Direct)模式 直白的说就是一对一,生产者对应唯一的消费者(当然同一个消费者可以开启多个服务). 虽然使用了自带的交换器(Exchang ...