思路:
最长前缀和,维护一个最长前缀和的二维数组,每个位置储存其左上角的所有数值的和,当计算某个区域的数字和时,只需要通过该表进行一个加减法操作,将n2的时间复杂度优化到了n2.
C++代码如下:
#include<iostream>
using namespace std;
int sum[601][601];
int main() {
int n,L,r,t;
cin>>n>>L>>r>>t;
int num;
for(int i = 1; i<=n; ++i) {
for(int j = 1; j<=n; ++j) {
cin>>sum[i][j];
sum[i][j]+=sum[i][j-1];
sum[i][j]+=sum[i-1][j];
sum[i][j]-=sum[i-1][j-1];
}
}
int cnt=0;
int s = 0;
int x1,y1,x2,y2;
for(int i = 1; i<=n; ++i) {
for(int j = 1; j<=n; ++j) {
x1 = max(0,j-r-1);
y1 = max(0,i-r-1);
x2 = min(n,j+r);
y2 = min(n,i+r);
s = sum[x2][y2]-sum[x2][y1]-sum[x1][y2]+sum[x1][y1];
if(s*1.0/((y2-y1)*(x2-x1))<=t) {
++cnt;
}
}
}
cout << cnt << endl;
return 0;
}