差分与前缀和是一组相反的操作。
差分一般比较适合用在区间操作(对一个区间进行整体的加减)。
差分操作如何表示?
修改前缀和数组的某个连续区间范围内的值,可以转化为只需要修改其差分数组的某两个值。
比如说:对区间[l, r]操作,表示为C[l] += c,且 C[r+1] -=c。
定义
给定一个数组 A ,其前缀和数组B表示A[i]及其之前所有数的和。
给定一个数组 A ,其差分数组C则表示数组C的前缀和为A[i]。
A数组可以看作是普通的数组,也可以看作是前缀和数组。
将一个数组看作普通数组,对其求前缀和,如下:
将一个数组看作前缀和数组,根据差分数组求前缀和,如下(这个差分数组的意思:[0, 2] + 1, [1,3] + 2):
因此有:
差分数组 => 前缀和 => 前缀和数组, 前缀和数组 => 求差分 => 差分数组
例子
给定一个数组 A ,其差分数组为 B。
如果对A数组的某个区间 [l, r]上每个数都加一个数c, 其等价于 B 数组中 B[l] += c,且 B[r+1] -=c。
因为A[l]表示B[l]的前缀和,则如果B[l]多加一个c(B[l] += c),则A[l], A[l+1], …, A[r], A[r+1], …, A[n] 都将多加一个c。
我们只需要 [l, r] 上加c,所以对于 A 在 [r+1, n]区间上的值再减去 c,即对应于 B[r+1] -= c。
最终所有m个操作后,得到的是对差分数组B的操作,分别求其各个位置的前缀和即得到A数组。