前缀和
这个题目我认为难点在于矩形的面积怎么求
假设有两个坐标分别为(A,b)和(c,d)
(这个坐标打的时候打错了)
所以这两个坐标围成的面积就是灰色的部分
因此我们先来想想怎么表示出面积
首先我们定义s[i][j]的含义,是指如图所围成的矩形面积
所以我们可以将我们要求的面积分块
这里我们可以知道我们要求的是蓝色区域
很容易可以看出应该是蓝色面积=s[c][d]–橙色部分–绿色部分;
代码表示就是s[c,d]–s[a-1][d]–s[c][b-1]+s[a-1][b-1]
(这里由于s[a-1][b-1]被减去了两次,因此还要加上多减去的一次)
但是这里还有个问题s[i][j]该如何表示呢?
这里我们也可以看图
(我的图太丑了)
蓝色的就是是s[i][j]所表示的矩形
继续看下面三幅图
我们可以知道蓝色部分就是橙色部分+绿色部分+a[i][j]–红色部分
可以写成
s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]–s[i-1][j-1];
所以代码实现就是
#include<iostream>
using namespace std;
const int N=1010;
int a[N][N];
long long s[N][N];
int main()
{
int n,m,q;
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 a,b,c,d;
cin>>a>>b>>c>>d;
//分别为左上和右下坐标
cout<<s[c][d]-s[a-1][d]-s[c][b-1]+s[a-1][b-1]<<endl;
}
return 0;
}