树上差分
1.算法分析
树上差分是把差分思想运用到树上的技巧,常数小,好写,思想简单。**处理的问题是:**给定两个点l、r,将l~r路径上所有的边(点)都加k,然后求每条边(点)的权值。
1.1 边差分
**问题描述:**给定两个点l、r,将l~r路径上所有的边都加k,然后求每条边的权值。
处理方法: f [ i ] f[i] f[i] 表示 i->fa[i]这条边的权值, f [ l ] + = k , f [ r ] + = k , f [ l c a ( l , r ) ] − = 2 ∗ k f[l] += k, f[r] += k, f[lca(l, r)] -= 2*k f[l]+=k,f[r]+=k,f[lca(l,r)]−=2∗k, dfs计算f[i]即可。
这里借用秦淮案大佬的图[https://www.cnblogs.com/gzh-red/p/11185914.html]。
只需要通过dfs求得f[]数组,即可知道每个f[i]。
1.2 点差分
**问题描述:**给定两个点l、r,将l~r路径上所有的点都加k,然后求每个点的权值。
处理方法:$ f[i]$ 表示i这个点的权值,$ f[l] += k, f[r] += k, f[lca(l, r)] -= k, f[fa[lca(l, r)]] -= k$, dfs计算f[i]即可。
2.典型例题
CF191C - Fools and Roads
题意: 有一颗 n 个节点的树,k次旅行,每次旅行从l走到r,问每一条边被走过的次数。
题解: 裸的lca+树上差分
代码:
#