记录编号 |
607141 |
评测结果 |
AAAAA |
题目名称 |
3971.不重叠正方形 |
最终得分 |
100 |
用户昵称 |
梦那边的美好TE |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.775 s |
提交时间 |
2025-10-07 00:22:02 |
内存使用 |
35.21 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
const int N=2010;
int s[N][N],n,m,ans;
int a[N][N],b[N][N],c[N][N],d[N][N];
int e[N],f[N],g[N],h[N],u[N][N],v[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++){
long long x;scanf("%lld",&x);
s[i][j]=s[i-1][j]+s[i][j-1]+x-s[i-1][j-1];
}
}
for(int i=m;i<=n;i++){
for(int j=m;j<=n;j++){
a[i][j]=s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m];
a[i][j]=max(a[i][j],max(a[i-1][j],a[i][j-1]));
}
}
for(int i=m;i<=n;i++){
for(int j=n-m+1;j>=1;j--){
b[i][j]=s[i][j+m-1]-s[i-m][j+m-1]-s[i][j-1]+s[i-m][j-1];
b[i][j]=max(b[i][j],max(b[i-1][j],b[i][j+1]));
}
}
for(int i=n-m+1;i>=1;i--){
for(int j=m;j<=n;j++){
c[i][j]=s[i+m-1][j]-s[i+m-1][j-m]-s[i-1][j]+s[i-1][j-m];
c[i][j]=max(c[i][j],max(c[i+1][j],c[i][j]));
}
}
for(int i=n-m+1;i>=1;i--){
for(int j=n-m+1;j>=1;j--){
d[i][j]=s[i+m-1][j+m-1]-s[i-1][j+m-1]-s[i+m-1][j-1]+s[i-1][j-1];
d[i][j]=max(d[i][j],max(d[i+1][j],d[i][j+1]));
}
}
for(int i=1;i<=n-m+1;i++){
int tmp=0;
for(int j=m;j<=n;j++){
tmp=max(tmp,s[i+m-1][j]-s[i-1][j]-s[i+m-1][j-m]+s[i-1][j-m]);
}
u[i][i+m-1]=tmp;
}
for(int i=1;i<=n-m+1;i++){
int tmp=0;
for(int j=m;j<=n;j++){
tmp=max(tmp,s[j][i+m-1]-s[j][i-1]-s[j-m][i+m-1]+s[j-m][i-1]);
}
v[i][i+m-1]=tmp;
}
for(int i=1;i<=n;i++){
for(int j=i+m-1;j<=n;j++){
u[i][j]=max(u[i][j],u[i][j-1]);
v[i][j]=max(v[i][j],v[i][j-1]);
}
}
for(int i=m;i<=n;i++){
for(int j=m;j<=n;j++){
int x=s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m];
e[i]=max(e[i],x),f[i-m+1]=max(f[i-m+1],x),g[j]=max(g[j],x),h[j-m+1]=max(h[j-m+1],x);
}
}
for(int i=1;i<=n;i++)e[i]=max(e[i],e[i-1]),g[i]=max(g[i],g[i-1]);
for(int i=n;i>=1;i--)f[i]=max(f[i],f[i+1]),h[i]=max(h[i],h[i+1]);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans=max(ans,e[i]+c[i+1][j]+d[i+1][j+1]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans=max(ans,f[i]+a[i-1][j]+b[i-1][j+1]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans=max(ans,g[j]+b[i][j+1]+d[i+1][j+1]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans=max(ans,h[j]+a[i][j-1]+c[i+1][j-1]);
}
}
for(int i=m+1;i<=n;i++){
for(int j=i+m-1;j<=n-m;j++){
ans=max(ans,e[i-1]+f[j+1]+u[i][j]);
ans=max(ans,g[i-1]+h[j+1]+v[i][j]);
}
}
printf("%lld\n",ans);
return 0;
}