@@ -24,29 +24,29 @@ words:
2424>
2525> ** 由于树链剖分代码较为冗长,本文所有代码均使用命名空间,` g ` 代表邻接表,` hld ` 代表树链剖分,` seg ` 代表线段树** 。
2626
27- ## 关于树链剖分
27+ # 关于树链剖分
2828
29- ### 是什么
29+ ## 是什么
3030
3131顾名思义,将一个树剖分为多条链。
3232
33- ### 为什么
33+ ## 为什么
3434
3535这样可以将原本树上的一对多信息关系化为一对一的线性关系,便于维护。(详见下文)
3636
37- ### 特点
37+ ## 特点
3838
3939* 将树剖分为至多 $\mathcal O(\log n)$ 条链。
4040* 每一条链上的 DFS 序均为连续的。
4141
42- ### 作用
42+ ## 作用
4343
4444* 修改 ** 树上两点之间的路径上** 所有点的值。
4545* 查询 ** 树上两点之间的路径上** 节点权值的 ** 和/极值/其它(在序列上可以用数据结构维护,便于合并的信息)** 。
4646* 求解 LCA。
4747* ......
4848
49- ## 概念
49+ # 概念
5050
5151首先,我们要知道两个概念:
5252
7070
7171<div style =" text-align : center ;font-size : 12px ;color : grey ;" >图片来源:<a href =" https://oi-wiki.org/graph/hld/#%E9%87%8D%E9%93%BE%E5%89%96%E5%88%86 " >OI Wiki</a ></div >
7272
73- ## 实现(预处理)
73+ # 实现(预处理)
7474
75- ### 所需信息
75+ ## 所需信息
7676
7777我们需要知道什么呢?
7878
8585* $x$ 在 DFS 序中的排名 $\textit{dfn}_ x$,用处见后文;
8686* DFS 序对应的节点编号 $\textit{rnk}_ {\textit{dfn}_ x}=x$,用处见后文;
8787
88- ### 第一遍 DFS
88+ ## 第一遍 DFS
8989
9090求出基本信息 $f_x,d_x,\textit{size}_ x,\textit{son}_ x$。
9191
@@ -111,7 +111,7 @@ namespace hld{
111111
112112**注意不要在计算 $size_x$ 时漏掉了 $x$ 本身,这虽然可能对求解 $son_x$ 没有影响,但是会对后文维护子树信息有影响。**
113113
114- ### 第二遍 DFS
114+ ## 第二遍 DFS
115115
116116求解 $\textit{top}_x,\textit{dfn}_x,\textit{rnk}_x$。
117117
@@ -146,11 +146,11 @@ void dfs2(int x,int topx){
146146
147147至此,树剖就已经完成了,接下来看应用。
148148
149- ## 应用
149+ # 应用
150150
151151<div style =" color : blue ;text-align : center ;font-size : 20px ;" ><a href =" https://www.luogu.com.cn/problem/P3384 " ><b >例题:洛谷P3384</b ></a ></div >
152152
153- ### 维护路径信息
153+ ## 维护路径信息
154154
155155对应例题的操作 $1,2$。
156156
@@ -206,7 +206,7 @@ int query(int u,int v){
206206}
207207```
208208
209- ### 维护子树信息
209+ ## 维护子树信息
210210
211211对应例题的操作 $3,4$。
212212
@@ -231,7 +231,7 @@ int query(int x){
231231}
232232```
233233
234- ### 求解 LCA 问题
234+ ## 求解 LCA 问题
235235
236236其实和[ 维护路径信息] ( #维护路径信息 ) 一模一样。
237237
@@ -247,7 +247,7 @@ int lca(int u,int v){
247247}
248248```
249249
250- ## 例题 AC 代码
250+ # 例题 AC 代码
251251
252252```cpp
253253//#include<bits/stdc++.h>
@@ -435,3 +435,8 @@ int main(){
435435}
436436```
437437
438+ # 树剖复杂度证明
439+
440+ 即证明重链数量为 $\mathcal O(\log n)$ 条。
441+
442+ 因为重子节点的性质,跳一次轻边子树大小至少会** 翻倍** 。因此轻边至多有 $\mathcal O(\log n)$ 条,进而有重链有 $\mathcal O(\log n)$ 条。
0 commit comments