比赛 |
国庆欢乐赛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;
}