树链剖分小结
什么是树链剖分 树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组、 \(BST\) 、 \(SPLAY\) 、线段树等)来维护每一条链。——百度百科 树链剖分就是维护轻、重链,然后用其他数据结构来维护。(一般用树状数组或线段树) 概念 重儿子:所有儿子中siz最大的结点 轻儿子:除了重儿子以外的儿子 (强调:一个节点出了重儿子以外的点 都是 轻儿子) 重边:与重儿子连成的边 轻边:与轻儿子连成的边 重链:由多条重边连接而成的路径 轻链:由多条轻边连接而成的路径(一般都只有一条) 设的变量 \(fa[x]\) , \(x\) 的父亲 \(dep[x]\) , \(x\) 的深度 \(siz[x]\) , \(x\) 的子树大小 \(son[x]\) , \(x\) 的重儿子 \(dfn[x]\) , \(x\) 的新的编号(做 \(dfs\) 的顺序) \(top[x]\) , \(x\) 所在的重链的顶端节点 (强调:我们可以保证每个节点都在也只在一条重链里) \(rk[x]\) , \(dfn[]\) 为 \(x\) 的在树中的节点 步骤 一般是两遍 \(dfs\) 。 第一遍:求出 \(fa[],dep[],siz[],son[]\) void dfs(int x) { dep[x] =