前缀和与差分
一维前缀和
思路
- 前缀和是用来存储前从1加到前i个数的和,记录时间O(n),计算只要O(1)
- 从第下标i = 1开始记录,数组开在main函数外面,默认s[0] = 0
- 前缀和主要是记公式:区间[l, r]的和等于s[r] - s[l -1]
公式
s[i] = a1 + a2 + … + ai = s[i- 1] + a[i]
sum[l, r] = s[r] - s[l-1]
二维前缀和
概念
用数组存储矩阵中任意位置的下标i,j为右下角,1,1为左上角的矩阵元素和
作用
求右下角为(x2, y2),左上角为(x1, y1)的矩阵元素和
公式
S[i, j] = S[i-1][j] + S[i][j-1] - S[i-1][j-1] + a[i][j]
res = s[x2, y2] - s[x1-1][y2] - s[x2][y1-1] + s[x1-1][y1-1]
计算s[i][j]
计算res
代码
//步骤:
//1.读入a数组并初始化
//2.根据(x1, y1)、(x2, y2)来计算子矩阵和
int a[N][N], S[N][N];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
scanf("%d", &a[i][j]);
S[i][j] = S[i - 1]