浅谈差分

发布时间 2023-10-02 00:04:09作者: Gmor_cerr

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;

Part4 习题

参考

OI-WiKi