比赛 国庆欢乐赛3 评测结果 WAAAA
题目名称 不重叠正方形 最终得分 80
用户昵称 徐诗畅 运行时间 0.786 s
代码语言 C++ 内存使用 53.03 MiB
提交时间 2025-10-05 10:11:09
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005;
int n,m,s1[N][N],s2[N][N],s3[N][N],s4[N][N];
int ul[N][N],ur[N][N],dl[N][N],dr[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",&s1[i][j]);
        s2[i][j]=s3[i][j]=s4[i][j]=s1[i][j];
    }
    for(int i = 1;i<=n;i++)
    for(int j = 1;j<=n;j++) s1[i][j]+=s1[i-1][j]+s1[i][j-1]-s1[i-1][j-1];
    for(int i = 1;i<=n;i++)
    for(int j = n;j>=1;j--) s2[i][j]+=s2[i-1][j]+s2[i][j+1]-s2[i-1][j+1];
    for(int i = n;i>=1;i--)
    for(int j = 1;j<=n;j++) s3[i][j]+=s3[i+1][j]+s3[i][j-1]-s3[i+1][j-1];
    for(int i = n;i>=1;i--)
    for(int j = n;j>=1;j--) s4[i][j]+=s4[i+1][j]+s4[i][j+1]-s4[i+1][j+1];
    for(int i = 1;i<=n;i++)
    for(int j = 1;j<=n;j++){
        if(i>=m&&j>=m) ul[i][j]=s1[i][j]-s1[i-m][j]-s1[i][j-m]+s1[i-m][j-m];
        ul[i][j]=max(ul[i][j],max(ul[i-1][j],ul[i][j-1]));
    }
    for(int i = 1;i<=n;i++)
    for(int j = n;j>=1;j--){
        if(i>=m&&j+m-1<=n) ur[i][j]=s2[i][j]-s2[i-m][j]-s2[i][j+m]+s2[i-m][j+m];
        ur[i][j]=max(ur[i][j],max(ur[i-1][j],ur[i][j+1]));
    }
    for(int i = n;i>=1;i--)
    for(int j = 1;j<=n;j++){
        if(i+m-1<=n&&j>=m)dl[i][j]=s3[i][j]-s3[i+m][j]-s3[i][j-m]+s3[i+m][j-m];
        dl[i][j]=max(dl[i][j],max(dl[i+1][j],dl[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) dr[i][j]=s4[i][j]-s4[i+m][j]-s4[i][j+m]+s4[i+m][j+m];
        dr[i][j]=max(dr[i][j],max(dr[i+1][j],dr[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=ul[i][j]+ur[i][j+1]+dl[i+1][n];
            ans=max(ans,res);
            res=dl[i+1][j]+dr[i+1][j+1]+ul[i][n];
            ans=max(ans,res);
        }
    }
    printf("%lld",ans);
    return 0;
}