树链剖分学习笔记
树链剖分 概述 :通过将一棵树上的点分为轻重链,来降低复杂度,此时lca查询复杂度为 \(O(logn)\) ,支持在线。 前置 重儿子 :一个有根树的一个点 子树最大的儿子 轻儿子 :其它的儿子 重链 :由重儿子连接成的链 轻链 :其它的所有链 下图是一棵剖好的树 图片来自于[ 知识点]树链剖分 树剖 树剖本体其实只有两个dfs 第一个dfs处理每个子树的大小,重儿子一类的信息 第二个dfs处理剖出的链的信息 void dfs1(int x) { int mx = -1; for(int i = head[x]; i; i = e[i].next) { int v = e[i].v; if(v == fa[x]) continue; dep[v] = dep[x] + 1;//处理深度 fa[v] = x;//父节点 siz[x]++;//大小 dfs1(v); siz[x] += siz[v];//回溯 if(siz[v] > mx) {//保留重儿子 mx = siz[v]; son[x] = v; } } } void dfs2(int x, int tp) { top[x] = tp;//链顶 if(son[x] != 0) { dfs2(son[x], tp);//优先搜索重儿子,让重儿子先成链 } for(int i = head[x]; i; i = e[i]