算法讲解161【挺难】树链剖分-上_哔哩哔哩_bilibili
重链剖分可以让树使用一个线性结构维护, 维护dfn序等信息
对于一个节点u的子树: 他的dfn序范围就是
对于每个重链上的点 都维护一个top信息 为这个重链的最顶端的节点
对于u, v路径上的节点, 比一下u, v节点top节点dfn序的大小, dfn序大的那个节点往上跳, 并更新/统计这个路径上的信息 一共最多跳log(n)次
核心代码:
cpp
while(top[x] != top[y]) {
if (dfn[top[x]] > dfn[top[y]]) {
swap(x, y);
}
seg.rangeUpdate(dfn[top[y]], dfn[y], tag);
y = fa[top[y]];
}
if (dfn[x] > dfn[y]) swap(x, y);
seg.rangeUpdate(dfn[x], dfn[y], tag);