用二维前缀和
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int n,L,r,t,res = 0;
cin>>n>>L>>r>>t;
int a[n][n],s[n][n];
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin>>a[i][j];
if(i == 0 && j == 0) s[i][j] = a[i][j];
else if(i == 0) s[i][j] = s[i][j-1] + a[i][j];
else if(j == 0) s[i][j] = s[i-1][j] + a[i][j];
else s[i][j] = s[i][j-1] + s[i-1][j] - s[i-1][j-1] + a[i][j];
}
}
int le,ri,hi,lo,tsum,tnum; //领域的左,右,上,下界
for(int i = 0; i < n; i++){
if(i < r) hi = 0;
else hi = i-r;
if(n-i-1 < r) lo = n-1;
else lo = i+r;
for(int j = 0; j < n; j++){
if(j < r) le = 0;
else le = j-r;
if(n-j-1 < r) ri = n-1;
else ri = j+r;
tnum = (lo-hi+1)*(ri-le+1);
if(hi == 0 && le == 0) tsum = s[lo][ri];
else if(hi == 0) tsum = s[lo][ri] - s[lo][le-1];
else if(le == 0) tsum = s[lo][ri] - s[hi-1][ri];
else tsum = s[lo][ri] - s[hi-1][ri] - s[lo][le-1] + s[hi-1][le-1];
if(tsum*1.0/tnum <= t*1.0) res++;
}
}
cout<<res;
return 0;
}
或用一维前缀和(代码简单但用时稍长)
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int n,L,r,t,res = 0;
cin>>n>>L>>r>>t;
int a[n][n],s[n][n];
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin>>a[i][j];
if(j == 0) s[i][j] = a[i][j];
else s[i][j] = s[i][j-1] + a[i][j];
}
}
int le,ri,hi,lo,tsum,tnum;
for(int i = 0; i < n; i++){
if(i < r) hi = 0;
else hi = i-r;
if(n-i-1 < r) lo = n-1;
else lo = i+r;
for(int j = 0; j < n; j++){
if(j < r) le = 0;
else le = j-r;
if(n-j-1 < r) ri = n-1;
else ri = j+r;
tnum = (lo-hi+1)*(ri-le+1);
tsum = 0;
for(int k = hi; k <= lo; k++){
tsum += s[k][ri] - s[k][le] + a[k][le];
}
if(tsum*1.0/tnum <= t*1.0) res++;
}
}
cout<<res;
return 0;
}