Skip to content

Commit 747e17c

Browse files
committed
update
1 parent a47b53a commit 747e17c

13 files changed

Lines changed: 1418 additions & 16 deletions

_posts/2024-11-15-2.md

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

@@ -70,9 +70,9 @@ words:
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

@@ -85,7 +85,7 @@ words:
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)$ 条。

_posts/2024-12-31-1.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,3 +712,16 @@ shuffle(order.begin(),order.end(),Rand);
712712
* $-\infty$:`0x80`
713713

714714
`0xc0` 保证相加之后不会爆 `int`,实际为 $-1061109568\approx-10^9$。
715+
716+
# 数据结构优化
717+
718+
## 线段树
719+
720+
### 线段树层数
721+
722+
* 线段树的上 $5$ 层可以直接砍掉,因为很少,可以暴力遍历。
723+
* 线段树的下 $5$ 层可以直接砍掉,可以暴力维护信息。
724+
725+
### 区间端点
726+
727+
当维护信息较少时,不建议在结构体内维护区间端点,因为会破坏内存访问的连续性。

_posts/2025-8-11-4.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,3 @@ int main(){
267267
return 0;
268268
}
269269
```
270-

0 commit comments

Comments
 (0)