【学习笔记】【算法】【施工ing】LCT
定义
动态树是一类要求维护森林连通性的问题。例如,在传统树链剖分的题目上加上删边与添边的操作,这使得树是动态的。
LCT 是解决动态树问题的算法的一种,其所做的是类似于重链剖分的“实链剖分”,树链剖分的儿子是始终固定的,而 LCT 则是会虚实变换,没有固定的实儿子,也没有划分标准,因此要使用比线段树之类更灵活的 Splay 来维护。因此,LCT = 树链剖分思想 + Splay。
因此,LCT 可以完成一切树链剖分的题目,属于是树剖上位了(
引入
引入 LCT 的一些概念。
- Preferred Child:实儿子,实儿子和父亲同属一个 Splay,且一个节点至多只能有一个实儿子。
- Preferred Edge:实边,链接实儿子和父亲的边。
- Preferred Path:实链,由实边和实边连接的节点构成的一条链。
同时,我们还需要构造一些辅助树。
- 由一条实链上的所有节点所构成的Splay称作这条链的辅助树。
- 每个点的键值为这个点的深度,即这棵Splay的中序遍历是这条链从链顶到链底的所有节点构成的序列。
- 在辅助树上的根节点的父亲就是链顶的父亲节点,但根节点不一定是链顶。
辅助树的每一条实链都用一棵 Splay 来维护。如下图:
基本操作
Access
作用为让点 到根节点的路径上的所有边变为实边,形成一条实链。主要作用是让这一条路径上的所有点形成一个 Splay,以便于操作或者查询。