动态树解析

xukuan

2020-01-19 09:26:15

Personal

## 基本概念 动态树中的每一个节点,它连向所有儿子的边中有一条实边和若干条虚边。实边和虚边实可以动态变化的,由实边构成的实链可以用splay来维护。 ## 支持的操作 1. 点或区间查询具有可加性和可减性的信息(可加性和可减性的定义参考线段树) 2. 动态加边或删边(LCT是为数不多的支持删除的数据结构之一) 3. 换根 4. split和merge(定义参考fhqtreap) ## 主要性质 1. 同一个splay中没有深度相同的节点 2. 实边在splay中而虚边连接两个不同的splay ## 各种主要操作 ### rotate 假设原来的树是这样的: ![](https://cdn.luogu.com.cn/upload/image_hosting/l3nm5la6.png?x-oss-process=image/resize,m_lfit,h_170,w_225) 对p点rotate之后就是这样子的: ![](https://cdn.luogu.com.cn/upload/image_hosting/92638loq.png?x-oss-process=image/resize,m_lfit,h_170,w_225) ### splay 把一个点一路rotate到根 ### access 把根和这个点上的路径全部变成实边,同时把一些实边变成虚边 就是把一个点splay到当前树的根节点,然后改右儿子,改轻重边 其实只有三件事: 1. 转到根 2. 换右儿子 3. 更新信息 ## 其他操作 ### isroot 它父节点的两个子节点有没有一个是自身 ### pushup&&pushdown 参考线段树 ### which 判断它是不是父节点的右儿子 ### getroot 先access再splay最后下传标记,左下角的那个就是root ### makeroot 先access在splay最后打标记 ### link 先makeroot再把一个的父节点设为另一个 ### split 先makeroot再acess最后splay ### cut 先split再改节点