故事是这样的,辣鸡我被要求写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)]]--.