这是一道二维前缀和的模板题
首先我们要知道,如何计算前缀和矩阵:容斥原理
为了防止出现边界问题,都是从1开始,因为是定义全局,所以s[0][0] = 0;
即s[x][y] = s[x - 1][y] + s[x][y - 1] - s[x - 1][y - 1] + a[x][y];
其次,如何利用前缀和矩阵来计算某一个子矩阵的和
假设我们要查询的是x1,y1,x2,y2,
那么,我们所要求的答案就是:s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]
为了方便记忆,我们可以找出个规律:所有的-1都是在x1 和 y1 上面操作
下面是代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n,m,q;
int a[N][N];
int s[N][N];
int main()
{
cin >> n >> m >> q;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
cin >> a[i][j];
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
}
}
while(q--)
{
int x1,y1,x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
printf("%d\n",s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]);
}
return 0;
}