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