树上差分
树上差分有两种形式,关于点的差分和边的差分。
先来考虑边的差分:
边的差分是用于解决边的覆盖问题的一种很优雅的方式。
具体方式为读入一条路径。对路径的起点,终点+1,对起点和终点的LCA-2.
统计一条边被覆盖的次数时只需统计这条边连的点中深度较大的那个点和它的子树的差分和即可。
另一种是关于点的差分:
点的差分可以用于解决路径覆盖点的次数的问题。
具体方式为读入一条路径,将起点和终点+1,将lca-1,将lca的父节点-1。
统计一个点被覆盖的次数即计算这个点和它的子树的差分和。
一个小trick:
求子树差分和时可以不用再单独跑一个dfs,可以在前面dfs的时候处理好dfs序,这样可以实现一行代码求差分和。
1 |
|
dfs序可以保证是从下往上加的,加这个点的时候这个点的下面所有节点都被加上了,顾可以保证差分和的正确性。
树上差分
http://example.com/2018/10/18/基本算法/树上差分/