Part1 定义
可简单理解为前缀和的逆运算
Part2 实现
定义 \(a\) 数组为 \(f\) 数组的前缀和,则 \(f\) 数组为 \(a\) 数组的差分数组,则有
\[a_i = \sum_{j=1}^{i} f_j = f_1 + f_2 + \cdots + f_i
\]
\[f_i=\begin{cases}a_i - a_{i-1}&i\in[2, n]\\a_1&i =1\end{cases}
\]
它可以维护多次对序列的一个区间的操作,并在最后询问某一位的数或是多次询问某一位的数。注意修改操作一定要在查询操作之前。
Part3 Code
一维差分
// 在 l 到 r 区间的数加上 x
a[l] += x; a[r+1] -= x;
二维差分
// 在 (x1, y1) 到 (x2, y2) 的矩阵内的数加上 x
s[x1][y1] += x; s[x2+1][y1] -= x; s[x1][y2+1] -= x; s[x2+1][y2+1] += x;