【基础算法】前缀和与差分
前缀和
一维
一维数组中,计算出所有前 n 个数的和,存储在一个单独的数组里,便于后续计算
板子
s[0] = 0; |
s[i] 计算的就是前 i 个数的和
当我们需要计算第 l 个数到第 r 个数的和时,只需要用 s[r] - s[l - 1] 即可
二维
二维数组中,计算出长为 0 - l, 宽为 0 - r 的矩阵和
这个值等于长为 0 - (l - 1) 宽为 0 - r 的矩阵加上 长为 0 - l 宽为 0 - (r - 1) 的矩阵减去 长为 0 - (l - 1) 宽为 0 - (r - 1)的矩阵 最后加上该位置的值
板子
for (int i = 1; i <= n; i ++ ) |
当我们需要计算左上角坐标为 (x1, y1), 右下角坐标为 (x2, y2) 的矩阵时,只需要用 s[x2][y2] - s[x1 - 1][y1] - s[x1][y1 - 1] + s[x1 - 1][y1 - 1] 即可
差分
差分与前缀和是逆运算,数组 a 是数组 b 的前缀和,数组 b 就是数组 a 的差分
即
a[i] = b[0] + b[1] + … + b[i]
b[i] = a[i] - a[i - 1]
一维
在一维数组中,将从 l 到 r 的每一个数都加上给定值 c
因为在给定区间内的每一个数都加了 c ,所以它们之间的差值不变,只有第 l - 1 与第 i 个数、第 r 与第 r + 1 个数的差值发生了改变,因此修改差分数组时只需要修改两个值,极大提高计算速度
适用于需要多次修改数组的情况
板子
void insert(int l, int r, int c) |
二维
二维数组中,将长为 0 - l, 宽为 0 - r 的矩阵中每一个元素都加上一个给定值 c
对于差分矩阵,需要进行如下操作:
- b[x1][y1] += c
- b[x2 + 1][y2 + 1] += c
- b[x2 + 1][y1] -= c
- b[x1][y2 + 1] -= c
板子
void insert(int x1, int y1, int x2, int y2, int c) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Texcavator 的秘密基地!
评论