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