首先考虑到暴力,我们可以枚举四个顶点, 我们可以枚举蓝点
,之后根据长方形性质的另外三个点,再遍历正方形即可复杂度为
,虽然看起来不错,但仍会TLE。
有没有快速计算一个正方形内有没有1呢。很不错,我们可以使用二维前缀和来优化我们可以记录在他之前有没有一。在查询时我们可以像一维前缀和那样剪掉a[i-1][y]-a[x][j-1]。但是这样仍然会WA,别忘了,记录时要减去a[i-1][j-1]查询时要加上a[i-1][j-1]QAQ。
MY CODE:
#include<bits/stdc++.h>
using namespace std;
char mp[1005][1005];
int a[1005][1005];
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char x;
cin>>x;
a[i][j]=x-'0';
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];//记录前缀和
}
}
int ans=0;
for(int i=1;i<=n-k+1;i++)
{
for(int j=1;j<=m-k+1;j++)
{
int x=i+k-1;
int y=j+k-1;
if(a[x][y]-a[i-1][y]-a[x][j-1]+a[i-1][j-1]>=1) //查询前缀和
ans++;
}
}
cout<<ans<<endl;//输出答案啊!!
return 0;
}
京公网安备 11010502036488号