二维前缀
202104-2 邻域均值
- 二维前缀数组构建方法是idx[i][j]+=idx[i-1][j]+idx[i][j-1]-idx[i-1][j-1],加上左边和上边的和,再减坐上被重复加的块的和。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,l,r,t;
cin>>n>>l>>r>>t;
vector<vector<int>> graph(n+1,vector<int>(n+1));
vector<vector<int>> idx(n+1,vector<int>(n+1,1));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>graph[i][j];
graph[i][j]+=graph[i-1][j]+graph[i][j-1]-graph[i-1][j-1];
idx[i][j]+=idx[i-1][j]+idx[i][j-1]-idx[i-1][j-1];
}
}
int res=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int top,bottom,left,right;
if(i+r>n)
bottom=n;
else
bottom=i+r;
if(i-r-1<0)
top=0;
else
top=i-r-1;
if(j+r>n)
right=n;
else
right=j+r;
if(j-r-1<0)
left=0;
else
left=j-r-1;
int div=idx[bottom][right]-idx[bottom][left]-idx[top][right]+idx[top][left];
int sum=graph[bottom][right]-graph[bottom][left]-graph[top][right]+graph[top][left];
double tmp=(double)sum/div;
if(tmp<=t){
res++;
}
}
}
cout<<res;
return 0;
}