树上差分:边差分与点差分
1.边差分:
一棵树,让x->y路径上的边权都加上w: d[x]+=w,d[y]+=w,d[lca(x,y)]-=2*w;
最后求出F[i]:以i为子树,d的权值和。即i -> fa[i] 的边权。
如下图:
让6 -> 5 路径上的边权全部加1.
d[2]=-2,d[6]=d[5]=1.其余为0
然后F的值为:F[6]=F[3]=F[5]=1. 表示
6 -> fa[6] 的边权为1,3 -> fa[3] 的边权为1,5 -> fa[5] 的边权为1,
点差分:
一棵树,让x->y路径上的点权都加上w: d[x]+=w,d[y]+=w,d[lca(x,y)]-=w,d[fa[lca(x,y)]];
最后求出F[i]:以i为子树,d的权值和。即i -> fa[i] 的边权。
看图说话:
让6 -> 5 路径上的边权全部加1.
d[2]==d[1]=-1,d[6]=d[5]=1.其余为0
然后F的值为:F[6]=F[3]=F[2]=F[5]=1.其余为0.
因为点2也算6 -> 5 路径上的点,5,6的贡献上移到lca(5,6)时,变成了2,需要在2点-1,且点2的父亲点权应该不变,所以也减一。