比赛 国庆欢乐赛3 评测结果 ATTTT
题目名称 不重叠正方形 最终得分 20
用户昵称 LikableP 运行时间 8.003 s
代码语言 C++ 内存使用 15.73 MiB
提交时间 2025-10-05 10:13:45
显示代码纯文本
#include <iostream>
using namespace std;
typedef long long ll;

template <typename T> T read() {
  T res = 0, f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ 48);
  return res * f;
}

template <typename T> void read(T &x) {
  x = read<T>();
}

template <typename T> void write(T x, char ed = '\n') {
  int sta[sizeof(T) << 2], top = 0;
  do {
    sta[++top] = x % 10;
    x /= 10;
  } while(x);
  while (top) {
    putchar(sta[top--] ^ 48);
  }
  putchar(ed);
}

const int MAXN = 1010;

int n, m;
ll a[MAXN][MAXN];
ll pre[MAXN][MAXN];
ll ans;

int main() {
  freopen("zfx.in", "r", stdin);
  freopen("zfx.out", "w", stdout);
  read(n), read(m);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      read(a[i][j]);
      pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + a[i][j];
    }
  }

  auto touch = [](int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) -> bool {
    if (x1 <= x3 && x3 <= x2 && y1 <= y3 && y3 <= y2) return true;
    if (x1 <= x3 && x3 <= x2 && y1 <= y4 && y4 <= y2) return true;
    if (x1 <= x4 && x4 <= x2 && y1 <= y3 && y3 <= y2) return true;
    if (x1 <= x4 && x4 <= x2 && y1 <= y4 && y4 <= y2) return true;
    return false;
  };

  auto sum = [](int x1, int y1, int x2, int y2) -> ll {
    return pre[x2][y2] - pre[x2][y1 - 1] - pre[x1 - 1][y2] + pre[x1 - 1][y1 - 1];
  };

  for (int x1 = 1; x1 <= n - m + 1; ++x1) {
    for (int y1 = 1; y1 <= n - m + 1; ++y1) {
      for (int x2 = 1; x2 <= n - m + 1; ++x2) {
        for (int y2 = 1; y2 <= n - m + 1; ++y2) {
          if (touch(x1, y1, x1 + m - 1, y1 + m - 1, x2, y2, x2 + m - 1, y2 + m - 1)) continue;
          for (int x3 = 1; x3 <= n - m + 1; ++x3) {
            for (int y3 = 1; y3 <= n - m + 1; ++y3) {
              if (touch(x1, y1, x1 + m - 1, y1 + m - 1, x3, y3, x3 + m - 1, y3 + m - 1)) continue;
              if (touch(x2, y2, x2 + m - 1, y2 + m - 1, x3, y3, x3 + m - 1, y3 + m - 1)) continue;
              ans = max(ans, sum(x1, y1, x1 + m - 1, y1 + m - 1) + sum(x2, y2, x2 + m - 1, y2 + m - 1) + sum(x3, y3, x3 + m - 1, y3 + m - 1));
            }
          }
        }
      }
    }
  }

  write(ans);
  return 0;
}