使用二维前缀和
代码:
#include <bits/stdc++.h> //100分 using namespace std; const int maxn = 605; int n, l, r, t; int a[maxn][maxn]; int b[maxn][maxn]; int main() // 二维前缀和 { cin >> n >> l >> r >> t; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { b[i][j] = b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1] + a[i][j]; // 预处理 } } int ans = 0; int sum = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { int x1, x2, y1, y2; // 越界 x1 = max(i - r, 1); y1 = max(j - r, 1); x2 = min(i + r, n); y2 = min(j + r, n); sum = b[x2][y2] - b[x1 - 1][y2] - b[x2][y1 - 1] + b[x1 - 1][y1 - 1]; int num = (x2 - x1 + 1) * (y2 - y1 + 1); double w = (double)sum / (double)num; if (w <= t) { ans++; } } } cout << ans; }