前缀和是一种极其优秀的线性结构,也是一种重要的思想,能极大地降低区间查询的时间复杂度。
一维前缀和#
1
2
|
S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]
|
二维前缀和#
1
2
3
|
S[i, j] = 第i行j列格子左上部分所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]
|
1
|
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + arr[i][j]
|
1
|
s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]
|
一维差分#
1
|
给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c
|
二维差分#
1
2
|
给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:
S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c
|
https://zhuanlan.zhihu.com/p/268883850