比赛 |
国庆欢乐赛3 |
评测结果 |
AEEEE |
题目名称 |
不重叠正方形 |
最终得分 |
20 |
用户昵称 |
会放牛的鸵鸟 |
运行时间 |
1.186 s |
代码语言 |
C++ |
内存使用 |
3.78 MiB |
提交时间 |
2025-10-05 11:38:14 |
显示代码纯文本
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 305;
int N, M;
int grid[MAXN][MAXN];
int prefix[MAXN][MAXN];
vector<pair<int, pair<int, int> > > squares;
void precompute() {
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
prefix[i][j] = grid[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1];
}
int query(int x1, int y1, int x2, int y2) {
return prefix[x2][y2] - prefix[x1-1][y2] - prefix[x2][y1-1] + prefix[x1-1][y1-1];
}
void enumerate_squares() {
for (int i = 1; i <= N-M+1; ++i)
for (int j = 1; j <= N-M+1; ++j)
squares.push_back({query(i,j,i+M-1,j+M-1), {i,j}});
sort(squares.rbegin(), squares.rend());
}
bool is_overlap(pair<int,int> a, pair<int,int> b) {
return !(a.first+M-1 < b.first || b.first+M-1 < a.first ||
a.second+M-1 < b.second || b.second+M-1 < a.second);
}
int main() {
freopen("zfx.in","r",stdin);
freopen("zfx.out","w",stdout);
cin >> N >> M;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
cin >> grid[i][j];
precompute();
enumerate_squares();
int max_sum = 0;
for (int i = 0; i < min(100, (int)squares.size()); ++i) {
for (int j = i+1; j < min(200, (int)squares.size()); ++j) {
if (is_overlap(squares[i].second, squares[j].second)) continue;
for (int k = j+1; k < min(300, (int)squares.size()); ++k) {
if (!is_overlap(squares[i].second, squares[k].second) &&
!is_overlap(squares[j].second, squares[k].second)) {
max_sum = max(max_sum, squares[i].first + squares[j].first + squares[k].first);
}
}
}
}
cout << max_sum << endl;
return 0;
}