浅谈差分

故事是这样的,辣鸡我被要求写dfs序,前置技能是树上差分,然后只好十分不情愿地学习了一下。


差分

差分数组(b):原数组(a)中相邻的差构成的数组。(b[i] = a[i] - a[i-1],b[1] = a[1])

性质:其前缀和为原数组。(b[2] = a[2]-a[1],b[3] = a[3]-a[2],b[i] = a[i]-a[i-1],b[1]+b[2]+...b[i] = a[i])

Skill:根据差分数组(c)求前缀和数组。

  c[i]  = ∑(1<=j<=i)a[j] = ∑(1<=j<=i)∑(1<=k<=j)b[k] = ∑(1<=j<=i) (j-i+1)*b[j] = (i+1)*∑(1<=j<=i)b[j] - ∑(1<=j<=i)j*b[j];

  用途:树状数组的区间修改操作。

类似地,经常用差分来维护序列的区间操作或者记录区间的贡献。

树上差分

 处理的数据有关于边(x,y):

  b[x]++,b[y]++,b[lca(x,y)]-=2.

处理的数据有关于点(x,y):

  b[x]++,b[y]++,b[lca(x,y)]--,b[father[lca(x,y)]]--.

猜你喜欢

转载自www.cnblogs.com/ve-2021/p/10889792.html