用途
解决树上问题,一般来说如果有查询又有询问就非常的复杂。如果用LCA你更改了树就会原地爆炸,因而树链剖分的用途就显现出来了。虽然板子多,还不如打暴力
预备概念
变量声明
操作
首先进行一次dfs求出除id,top外的数组。
void dfs1(int step,int fa1){
size[step] = 1;
for (int i = 0;i < G[step].size();i ++){
int u = G[step][i];
if (u != fa1){
fa[u] = step;
dep[u] = dep[step] + 1;
dfs1(u,step);
size[step] += size[u];
if (size[u] > size[son[step]])
son[step] = u;
}
}
}
然后,在进行一次dfs求出id,top
void dfs2(int step,int fa1){
id[step] = ++ cnt;
w1[cnt] = w[step];
top[step] = fa1;
if (!son[step])
return ;
dfs2(son[step],fa1);
for (int i = 0;i < G[step]