原数组 s[N][N] 前缀和素组 p[N][N];
二维前缀和公式:
p[i][j] = s[i][j] + p[i - 1][j] + p[i][j - 1] - p[i - 1][j - 1];
子矩阵公式:
ans = ans = p[x2][y2] - p[x2][y1 - 1] - p[x1 - 1][y2] + p[x1 - 1][y1 - 1];
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, m, q;
int s[N][N], p[N][N];
int main()
{
scanf("%d %d %d", &n, &m, &q);
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
scanf("%d", &s[i][j]);
p[i][j] = s[i][j] + p[i - 1][j] + p[i][j - 1] - p[i - 1][j - 1];
}
}
while(q --)
{
int x1, y1, x2, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
int ans = p[x2][y2] - p[x2][y1 - 1] - p[x1 - 1][y2] + p[x1 - 1][y1 - 1];
printf("%d\n", ans);
}
return 0;}