二维前缀和

由图1,二维前缀和的递推公式是:$s[i][j] = s[i-1][j] + s[i][j-1] -s[i-1][j-1] + a[i][j]$。
由图2,二维前缀和的查询公式是:前缀和 = $s[x_2][y_2] - s[x_1 - 1][y_2] - s[x_2][y_1-1] + s[x_1-1][y_1-1]$。
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 const int N = 1010; 7 8 int n, m, q; 9 int s[N][N]; 10 11 int main() 12 { 13 scanf("%d%d%d", &n, &m, &q); 14 15 for (int i = 1; i <= n; i ++ ) 16 for (int j = 1; j <= m; j ++ ) 17 scanf("%d", &s[i][j]); 18 19 for (int i = 1; i <= n; i ++ ) 20 for (int j = 1; j <= m; j ++ ) 21 s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1]; 22 23 while (q -- ) 24 { 25 int x1, y1, x2, y2; 26 scanf("%d%d%d%d", &x1, &y1, &x2, &y2); 27 printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]); 28 } 29 30 return 0; 31 }

浙公网安备 33010602011771号