预处理的公式
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e3+9;
int a[N][N];
int prefix[N][N];
int n,m,q;
int ans;
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
prefix[i][j]=prefix[i][j-1]+prefix[i-1][j]-prefix[i-1][j-1]+a[i][j];
}
while(q--)
{
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
cout<<(prefix[x2][y2]-prefix[x1-1][y2]-prefix[x2][y1-1]+prefix[x1-1][y1-1])<<endl;
}
return 0;
}
代码注释
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+9;
using ll=long long;
ll pre[N][N],a[N][N],n,m,q;
//对于每一行有y1-y2求和
//对于每一列有x1-x2求和
//所以最后就是矩阵的区域
//二维前缀和就是求一个区域之内的和
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{ //预处理
cin>>a[i][j];
pre[i][j]=pre[i-1][j]+pre[i][j-1]+a[i][j]-pre[i-1][j-1];
//总和=绿(求)+橙+黄-红
}
while(q--)
{
//(x1,x2)、(y1,y2)为对角线的区域的值
int x1,x2,y1,y2;cin>>x1>>y1>>x2>>y2;
cout<<pre[x2][y2]-pre[x1-1][y2]-pre[x2][y1-1]+pre[x1-1][y1-1]<<endl;
//二维计算前缀和,还是求绿框内的值
}
}