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