树链剖分似乎是个很强大的东西
可惜我之前不会啊
所以就mark一下啊
定义
树链剖分 简称树剖.对于一般的树上路径/权值的问题,Tarjan的LCA在线性内就可以快速求解.
如果要修改点权或者边权呢?
树链剖分就是用来解决动态修改树上权值并求解的问题的
一般树链剖分更新权值的复杂度为$O(logn)$,统计路径信息的复杂度为$O((logn)^2)$
内容
某些一定要知道的概念
- 重节点:子树结点数目最多的节点;
- 轻节点:父亲节点中除了重结点以外的节点;
- 重边:父亲节点和重节点连成的边;
- 轻边:父亲节点和轻节点连成的边;
- 重链:由多条重边连接而成的路径;
- 轻链:由多条轻边连接而成的路径;
这些东西有一个性质.
1.一条重链在线段树上是一段连续的区间。
2.一个节点的重儿子就是这个节点的子节点中子树最大的点。
所以第一次dfs求出重儿子
第二次通过dfs时间戳(dfn),得出节点新编号,并且将各个重节点连接成重链,轻节点连接成轻链
将重链(其实就是一段区间)用数据结构(一般是树状数组或线段树)来进行维护
为每个节点进行编号,其实就是DFS在执行时的顺序(id数组)
以及当前节点所在链的起点(top数组),还有当前节点在树中的位置(rnk数组).
1 | //dfs1 |
1 | //dfs2 |
LUOGU P3384 树链剖分[模板]
1 | //my vegetable has exploded. :( |
POJ-2763
基于边权修改的树剖.
1 | //my vegetable has exploded. :( |
:)karriganasta