比赛 |
国庆欢乐赛3 |
评测结果 |
ATTTT |
题目名称 |
不重叠正方形 |
最终得分 |
20 |
用户昵称 |
xuyuqing |
运行时间 |
8.002 s |
代码语言 |
C++ |
内存使用 |
22.34 MiB |
提交时间 |
2025-10-05 11:01:31 |
显示代码纯文本
#include <cmath>
#include <cstdio>
#include <iostream>
#include <queue>
#include <utility>
#include <vector>
using namespace std;
const int N = 1145;
int n;
int m;
long long nums[N][N];
long long squares[N][N];
vector<pair<long long, pair<int, int> > > sqs;
vector<pair<long long, pair<int, int> > > ts;
priority_queue<pair<long long, pair<int, int> > > pq;
long long res;
bool judge (pair<int, int> one, pair<int, int> two) {
return abs (one.first - two.first) < m && abs (one.second - two.second) < m;
}
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 >> nums[i][j];
nums[i][j] = nums[i][j] + nums[i - 1][j] + nums[i][j - 1] - nums[i - 1][j - 1];
}
}
for (int i = m; i <= n; i++) {
for (int j = m; j <= n; j++) {
sqs.emplace_back(nums[i][j] - nums[i - m][j] - nums[i][j - m] + nums[i - m][j - m], make_pair (i, j));
pq.emplace(*sqs.rbegin());
}
}
for (auto sq1 : sqs) {
int num1 = sq1.first;
auto p1 = sq1.second;
for (auto sq2 : sqs) {
int num2 = sq2.first;
auto p2 = sq2.second;
if (judge (p1, p2)) {
continue;
}
while (!pq.empty()) {
auto t = pq.top();
ts.push_back(t);
pq.pop();
if (!judge (t.second, p1) && !judge (t.second, p2)) {
res = max (res, t.first + num1 + num2);
break;
}
}
for (auto tt : ts) {
pq.push(tt);
}
ts.clear();
}
}
cout << res << endl;
return 0;
}