比赛 国庆欢乐赛3 评测结果 WAWWW
题目名称 不重叠正方形 最终得分 20
用户昵称 梦那边的美好TE 运行时间 0.856 s
代码语言 C++ 内存使用 10.04 MiB
提交时间 2025-10-05 09:58:08
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=1010;
int n,m;
void read(int &x){
    x=0;int f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-48,ch=getchar();
    x*=f;return;
}
ll s[N][N],c[10][N],ans;
void upd(int o,int x,ll v){
    for(;x<=n;x+=(x&-x))c[o][x]=max(c[o][x],v);
    return;
}
ll qry(int o,int x){
    ll cnt=0;
    for(;x>0;x-=(x&-x))cnt=max(cnt,c[o][x]);
    return cnt;
}
void add(int o,int x,ll v){
    upd(o,x,v),upd(o+4,n-x+1,v);
    return;
}
ll ask(int o,int x){
    return max(qry(o,x-m),qry(o+4,n-x-m+1));
}
int main(){
    freopen("zfx.in","r",stdin);
    freopen("zfx.out","w",stdout);
    read(n),read(m);
    for(int i=1;i<=n;i++){
        for(int j=1,x;j<=n;j++){
            read(x);s[i][j]=x;
            s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
        }
    }
    ll tmp,res;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i>=m&&j>=m){
                tmp=s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m];
                add(0,i,tmp),add(2,j,tmp);
                res=tmp+max(ask(0,i),ask(2,j));
                add(1,i,res),add(3,j,res);
                res=tmp+max(ask(1,i),ask(3,j));
                ans=max(res,ans);
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}