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