树链剖分 学习笔记
解决问题
修改树上某一路径的权值,查询树上某一路径(子树)的权值。
基本思想
将树上的结点分成若干重链,每次只用维护重链即可。
算法步骤
1.两次DFS,分别预处理出{father,dep,size,son}和{top,seg,rev};
2.建线段树;
3.修改&求值
DFS细节
第一次DFS没啥细节。
第二次注意在DFS前先处理根节点。对于每个结点先走重儿子,保证线段树中重链连续;然后处理其他儿子。
1 | void dfs2(int u){ |
修改细节
对于每条路径的两个结点,若不在同一条重链上,则选取深的重链往上跳;最后更新当前重链。
1 | void modify(int x,int y,int v){ |
询问细节
大体流程与修改相同,代码略。