基础算法4: 前缀和,差分
前缀和与差分
原理介绍
一维前缀和
前缀和是一种预处理技巧,可以 O(1) 时间查询任意区间的和。
定义原数组 a[1..n],前缀和数组 s[i] = a[1] + a[2] + ... + a[i]。
查询区间 [l, r] 的和:sum(l, r) = s[r] - s[l-1]。
一维差分
差分是前缀和的逆运算,可以 O(1) 时间对区间进行批量加减,最后通过一次前缀和还原结果数组。
定义差分数组 d,使得 a[i] = d[1] + d[2] + ... + d[i]。
若要对区间 [l, r] 每个元素加 x,只需:
1 | d[l] += x; |
二维前缀和
在矩阵中快速求子矩阵和。
定义 s[i][j] 为原矩阵 a 从 (1,1) 到 (i,j) 的子矩阵元素和。
递推公式:
1 | s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j] |
查询以 (x1, y1) 为左上角,(x2, y2) 为右下角的子矩阵和:
1 | sum = s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] + s[x1-1][y1-1] |
二维差分
与一维差分类似,用于对子矩阵进行批量加减,最后通过二维前缀和还原矩阵。
二维差分的构造:
1 | diff[x1][y1]+= v; |
二维差分数组求前缀和:
1 | diff[i][j] = diff[i][j] + diff[i - 1][j] + diff[i][j - 1] - diff[i - 1][j - 1]; |
最后附上代码:
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 yyx的个人主页!