蓝桥杯好题推荐---二位前缀和
🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
题目链接
【模板】二维前缀和https://ac.nowcoder.com/acm/problem/226333
解题思路
在这道题目当中,是要我们输出以x1,y1为左上角,x2,y2为右下角的子矩阵的和,其实这个首先很简单的思路,就是可以进行枚举,但是枚举的话,时间复杂度会超过题目的要求。第二个就是利用前缀和的方法,我们的前缀和数组f[i][j]中存放的是从(0,0)到(i,j)的所有的数的和。
那我们应该怎么设置这个二维数组呢?
这个的面积,我们可以表示为(A+C)+(A+B)-A+x
那我们怎么表示要查找的这片区域的面积呢?
cout<<f[x2][y2]-f[x1-1][y2]-f[x2][y1-1]+f[x1-1][y1-1]<<endl;
除了这些以外,我们应该还要注意数据的范围。
当我们数字求和的时候,可能会超出Int的类型范围,所以,我们应采用long long 类型。
代码解决
#include<iostream>
using namespace std;
const int N =1010;
typedef long long LL;
LL f[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++)
{
LL x;cin>>x;
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+x;
}
}
while(q--)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
cout<<f[x2][y2]-f[x1-1][y2]-f[x2][y1-1]+f[x1-1][y1-1]<<endl;
}
return 0;
}
好了,今天的内容就到这里,我们明天再见。