题目:
https://wingrez.blog.csdn.net/article/details/117396085
思路:
具体思路也可见上面的网址,考虑前缀和(这个怎么求就不用我说了吧!!!)来快速求解满足题目要求的矩形区域的和,需要四个点(x1,y1),(x2,y2),(x3,y3),(x4,y4)如图所示
假设已经求出了前缀和数组sum,然后用sum[x4][y4] - sum[x3][y3] -sum[x2][y2] + sum[x1][y1]即可得到对应矩形的元素和,矩形中元素个数即是(x4 - x1) * (y4 - y1)
至于这四个点的坐标怎么求,还有些技巧,详见代码.
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=6e2+10;
int g[N][N],n,L,r,t,res;
int main()
{
cin>>n>>L>>r>>t;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>g[i][j];
g[i][j]+=g[i-1][j]+g[i][j-1]-g[i-1][j-1];//求前缀和
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int left = max(0,j-r-1);
int right = min(n,j+r);
int down = min(n,i+r);
int up = max(0,i-r-1);
//(left,up),(left,down),(right,up),(right,down)
int sum = g[down][right]-g[up][right]-g[down][left]+g[up][left];
int num = (right-left)*(down-up);
if(sum<=t*num)
res++;
}
cout<<res<<endl;
return 0;
}
四个点的坐标均在代码中注释出,自己仔细品一下!!!