比赛 国庆欢乐赛3 评测结果 WAAAA
题目名称 不重叠正方形 最终得分 80
用户昵称 wdsjl 运行时间 0.768 s
代码语言 C++ 内存使用 53.05 MiB
提交时间 2025-10-05 11:26:51
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1005;

int n,m,sum1[N][N],sum2[N][N],sum3[N][N],sum4[N][N];
int sz[N][N],sy[N][N],xz[N][N],xy[N][N];

signed main(){
    freopen("zfx.in","r",stdin);
    freopen("zfx.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
        scanf("%lld",&sum1[i][j]);
        sum2[i][j]=sum3[i][j]=sum4[i][j]=sum1[i][j];
    }
    for(int i=1;i<=n;i++){
        for(int j = 1;j<=n;j++){
            sum1[i][j]+=sum1[i-1][j]+sum1[i][j-1]-sum1[i-1][j-1];
        } 
    }
    for(int i=1;i<=n;i++){
        for(int j=n;j>=1;j--){
            sum2[i][j]+=sum2[i-1][j]+sum2[i][j+1]-sum2[i-1][j+1];
        }
    }
    for(int i=n;i>=1;i--){
        for(int j = 1;j<=n;j++){
            sum3[i][j]+=sum3[i+1][j]+sum3[i][j-1]-sum3[i+1][j-1];
        }
    }
    for(int i = n;i>=1;i--){
        for(int j = n;j>=1;j--){
            sum4[i][j]+=sum4[i+1][j]+sum4[i][j+1]-sum4[i+1][j+1];
        }
    }//二维前缀和 
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=n;j++){
            if(i>=m&&j>=m) {
                sz[i][j]=sum1[i][j]-sum1[i-m][j]-sum1[i][j-m]+sum1[i-m][j-m];
            }
            sz[i][j]=max(sz[i][j],max(sz[i-1][j],sz[i][j-1]));
        }
    } 
    for(int i = 1;i<=n;i++){
        for(int j = n;j>=1;j--){
            if(i>=m&&j+m-1<=n) sy[i][j]=sum2[i][j]-sum2[i-m][j]-sum2[i][j+m]+sum2[i-m][j+m];
            sy[i][j]=max(sy[i][j],max(sy[i-1][j],sy[i][j+1]));
        } 
    }
    for(int i = n;i>=1;i--){
        for(int j = 1;j<=n;j++){
            if(i+m-1<=n&&j>=m){
                xz[i][j]=sum3[i][j]-sum3[i+m][j]-sum3[i][j-m]+sum3[i+m][j-m];
            }
            xz[i][j]=max(xz[i][j],max(xz[i+1][j],xz[i][j-1])); 
        }
    }
    for(int i = n;i>=1;i--){
        for(int j = n;j>=1;j--){
            if(i+m-1<=n&&j+m-1<=n){
                xy[i][j]=sum4[i][j]-sum4[i+m][j]-sum4[i][j+m]+sum4[i+m][j+m];
            }
            xy[i][j]=max(xy[i][j],max(xy[i+1][j],xy[i][j+1]));
        }
    }
    int ans=0;
    for(int i = m;i+m-1<=n;i++){
        for(int j = m;j+m-1<=n;j++){
            int res=sz[i][j]+sy[i][j+1]+xz[i+1][n];
            ans=max(ans,res);
            res=xz[i+1][j]+xy[i+1][j+1]+sz[i][n];
            ans=max(ans,res);
        }
    }
    printf("%lld",ans);
    return 0;
}