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