比赛 |
国庆欢乐赛3 |
评测结果 |
WTAWW |
题目名称 |
不重叠正方形 |
最终得分 |
20 |
用户昵称 |
健康铀 |
运行时间 |
2.703 s |
代码语言 |
C++ |
内存使用 |
42.44 MiB |
提交时间 |
2025-10-05 11:44:04 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
freopen("zfx.in","r",stdin);
freopen("zfx.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
vector<vector<ll>> a(n, vector<ll>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
vector<vector<ll>> p(n + 1, vector<ll>(n + 1, 0));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
p[i][j] = a[i - 1][j - 1] + p[i - 1][j] + p[i][j - 1] - p[i - 1][j - 1];
}
}
vector<vector<ll>> s(n - m + 1, vector<ll>(n - m + 1, 0));
for (int i = 0; i <= n - m; i++) {
for (int j = 0; j <= n - m; j++) {
s[i][j] = p[i + m][j + m] - p[i][j + m] - p[i + m][j] + p[i][j];
}
}
vector<vector<ll>> t(n, vector<ll>(n, 0));
vector<vector<ll>> b(n, vector<ll>(n, 0));
vector<vector<ll>> l(n, vector<ll>(n, 0));
vector<vector<ll>> r(n, vector<ll>(n, 0));
for (int i = 0; i <= n - m; i++) {
for (int j = 0; j <= n - m; j++) {
t[i + m - 1][j] = max(t[i + m - 1][j], s[i][j]);
if (i > 0) {
t[i + m - 1][j] = max(t[i + m - 1][j], t[i + m - 2][j]);
}
if (j > 0) {
t[i + m - 1][j] = max(t[i + m - 1][j], t[i + m - 1][j - 1]);
}
}
}
for (int i = n - m; i >= 0; i--) {
for (int j = n - m; j >= 0; j--) {
b[i][j] = max(b[i][j], s[i][j]);
if (i < n - m) {
b[i][j] = max(b[i][j], b[i + 1][j]);
}
if (j < n - m) {
b[i][j] = max(b[i][j], b[i][j + 1]);
}
}
}
for (int j = 0; j <= n - m; j++) {
for (int i = 0; i <= n - m; i++) {
l[i][j + m - 1] = max(l[i][j + m - 1], s[i][j]);
if (j > 0) {
l[i][j + m - 1] = max(l[i][j + m - 1], l[i][j + m - 2]);
}
if (i > 0) {
l[i][j + m - 1] = max(l[i][j + m - 1], l[i - 1][j + m - 1]);
}
}
}
for (int j = n - m; j >= 0; j--) {
for (int i = n - m; i >= 0; i--) {
r[i][j] = max(r[i][j], s[i][j]);
if (j < n - m) {
r[i][j] = max(r[i][j], r[i][j + 1]);
}
if (i < n - m) {
r[i][j] = max(r[i][j], r[i + 1][j]);
}
}
}
ll res = 0;
for (int i1 = m; i1 <= n - 2 * m; i1++) {
for (int i2 = i1 + m; i2 <= n - m; i2++) {
ll s1 = 0, s2 = 0, s3 = 0;
for (int i = 0; i <= i1 - m; i++) {
for (int j = 0; j <= n - m; j++) {
s1 = max(s1, s[i][j]);
}
}
for (int i = i1; i <= i2 - m; i++) {
for (int j = 0; j <= n - m; j++) {
s2 = max(s2, s[i][j]);
}
}
for (int i = i2; i <= n - m; i++) {
for (int j = 0; j <= n - m; j++) {
s3 = max(s3, s[i][j]);
}
}
res = max(res, s1 + s2 + s3);
}
}
for (int j1 = m; j1 <= n - 2 * m; j1++) {
for (int j2 = j1 + m; j2 <= n - m; j2++) {
ll s1 = 0, s2 = 0, s3 = 0;
for (int i = 0; i <= n - m; i++) {
for (int j = 0; j <= j1 - m; j++) {
s1 = max(s1, s[i][j]);
}
}
for (int i = 0; i <= n - m; i++) {
for (int j = j1; j <= j2 - m; j++) {
s2 = max(s2, s[i][j]);
}
}
for (int i = 0; i <= n - m; i++) {
for (int j = j2; j <= n - m; j++) {
s3 = max(s3, s[i][j]);
}
}
res = max(res, s1 + s2 + s3);
}
}
for (int i = m; i <= n - m; i++) {
for (int j = m; j <= n - m; j++) {
ll tl = 0, tr = 0, bl = 0, br = 0;
for (int x = 0; x <= i - m; x++) {
for (int y = 0; y <= j - m; y++) {
tl = max(tl, s[x][y]);
}
}
for (int x = 0; x <= i - m; x++) {
for (int y = j; y <= n - m; y++) {
tr = max(tr, s[x][y]);
}
}
for (int x = i; x <= n - m; x++) {
for (int y = 0; y <= j - m; y++) {
bl = max(bl, s[x][y]);
}
}
for (int x = i; x <= n - m; x++) {
for (int y = j; y <= n - m; y++) {
br = max(br, s[x][y]);
}
}
res = max(res, tl + tr + bl);
res = max(res, tl + tr + br);
res = max(res, tl + bl + br);
res = max(res, tr + bl + br);
}
}
cout << res << endl;
return 0;
}