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