dfs序

· · 个人记录

DFS序总结

DFS序:ABCDEFG(序列长度为 n

关于DFS序在树上问题的应用

1. 链上的操作(修改或查询)

u 到点 v 之间的这条链,可以转化为:

\text{点 } u \text{ 到 root 的链 } + \text{点 } v \text{ 到 root 的链 } - \text{lca 到 root 的链 } - \text{father[lca] 到 root 的链}

由于可以转化,下面总结里的链查询都表示点 u 到 root。

2. 点修改,子树查询

突破口:思考修改一个点会对哪些链产生影响——它子树上的点。

DFS序:相当于子树上的所有点到根节点的距离都多了一个 \Delta

dis[\text{in}[u]] 表示点 u 到根节点 root 的距离。

3. 子树修改,点查询

4. 子树修改,子树查询

5. 子树修改,链查询

DFS序解法

突破口:探究这个修改会影响哪些值,以及影响多少?它会影响以 x 为根节点的子树。假设修改了以 x 为根节点的子树,对于子树里的节点 y,其距离增加了:

(\text{dep}[y] - \text{dep}[x] + 1) \cdot \Delta

化简后得到:

\text{dep}[y] \cdot \Delta - (\text{dep}[x] - 1) \cdot \Delta \text{ask}_2(\text{in}[y]) \cdot \text{dep}[y] - \text{ask}_1(\text{in}[y])

6. 链修改,点查询

突破口:修改一条链会对哪些点产生影响?修改点 u 到 root 这条链会对 u 的所有祖先产生影响。

令差分数组 d[u] 表示:

w[u] - \sum w[v], \quad \text{其中 } \text{fa}[v] = u

因此:

w[u] = \sum d[x], \quad \text{其中 } x \text{ 是以 } u \text{ 为根节点的子树里的点}

7. 链修改,子树查询

突破口:修改一条链对子树有何影响?假设现在修改点 u 到 root 这条链,对于 u 的祖先 vuv 的贡献是:

(\text{dep}[u] - \text{dep}[v] + 1) \cdot \Delta

化简后得到:

(\text{dep}[u] + 1) \cdot \Delta - \text{dep}[v] \cdot \Delta

需要开两个树状数组进行单点修改与区间查询。