树链剖分
OI Wiki [视频链 接](https://www.bilibili.com/video/BV1tY4y1G7em/?spm_id_from=333.999.0.0&vd_source=c473bb1aae89eee47588dfc50fe8dc40重链剖分可以将树上的任意一条路径划分成不超过$O(logn)$条连续的链,每条链上的点深度互不相同(即是自底向上的一条链,链上所有点的 LCA 为链的一个端点)
重链剖分可以将树上的任意一条路径划分成不超过条连续的链,每条链上的点深度互不相同(即是自底向上的一条链,链上所有点的 LCA 为链的一个端点) 。
重链剖分还能保证划分出的每条链上的节点 DFS 序连续,因此可以方便地用一些维护序列的数据结构(如线段树)来维护树上路径的信息。
一些重要的概念
-
重儿子:父节点的所有儿子中子树节点数目最多的结点
-
轻儿子:父节点中除重儿子以外的儿子
-
重边:父节点喝重儿子连成的边
-
轻边:父节点和轻儿子连成的边
-
重链:由多条重边链接而成的路径
性质:
- 整棵树会被剖分成若干条重链
- 轻儿子一定是每条重链的顶点
- 任意一条路径被分成不超过条链
在代码中的含义
fa[u]
表示存u的父节点dep[u]
存u的深度son[u]
存u的重儿子sz[u]