QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#645113#9473. Puzzle GameAfterlife#AC ✓14ms3960kbC++203.0kb2024-10-16 16:56:172024-10-16 16:56:19

Judging History

你现在查看的是最新测评结果

  • [2024-10-16 16:56:19]
  • 评测
  • 测评结果:AC
  • 用时:14ms
  • 内存:3960kb
  • [2024-10-16 16:56:17]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=155;
int n,m,P;
int a[N][N],c[N][N];
const int inf=0x3f3f3f3f;
int U[N],D[N],L[N],R[N];
void Solve(){
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            cin>>a[i][j];
            c[i][j]=-inf;
        }
    }
    U[0]=D[n+1]=L[0]=R[m+1]=-inf;
    for(int l=n;l>=1;--l){
        static int s[N];
        memset(s,0,sizeof(s));
        D[l]=D[l+1];
        for(int r=l;r<=n;++r){
            for(int i=1;i<=m;++i){
                s[i]+=a[r][i];
            }
            for(int i=1,x=0;i<=m;++i){
                x=max(s[i],x+s[i]);
                D[l]=max(D[l],x);
            }
        }
    }
    for(int r=1;r<=n;++r){
        static int s[N];
        memset(s,0,sizeof(s));
        U[r]=U[r-1];
        for(int l=r;l>=1;--l){
            for(int i=1;i<=m;++i){
                s[i]+=a[l][i];
            }
            for(int i=1,x=0;i<=m;++i){
                x=max(s[i],x+s[i]);
                U[r]=max(U[r],x);
            }
        }
    }
    for(int l=m;l>=1;--l){
        static int s[N];
        memset(s,0,sizeof(s));
        R[l]=R[l+1];
        for(int r=l;r<=m;++r){
            for(int i=1;i<=n;++i){
                s[i]+=a[i][r];
            }
            for(int i=1,x=0;i<=n;++i){
                x=max(s[i],x+s[i]);
                R[l]=max(R[l],x);
            }
        }
    }
    for(int r=1;r<=m;++r){
        static int s[N];
        memset(s,0,sizeof(s));
        L[r]=L[r-1];
        for(int l=r;l>=1;--l){
            for(int i=1;i<=n;++i){
                s[i]+=a[i][l];
            }
            for(int i=1,x=0;i<=n;++i){
                x=max(s[i],x+s[i]);
                L[r]=max(L[r],x);
            }
        }
    }
    int ans=U[n];
    for(int l=1;l<=m;++l){
        static int s[N],pre[N],suf[N],tmp[N][N],ss[N];
        memset(s,0,sizeof(s));
        for(int r=l;r<=m;++r){
            pre[0]=0;
            suf[n+1]=-inf;
            for(int i=1;i<=n;++i){
                s[i]+=a[i][r];
            }
            for(int i=1;i<=n;++i){
                ss[i]=ss[i-1]+s[i];
            }
            for(int i=1;i<=n;++i){
                pre[i]=max(pre[i-1],-ss[i]);
            }
            for(int i=n;i>=1;--i){
                suf[i]=max(suf[i+1],ss[i]);
            }
            for(int i=1;i<=n;++i){
                int w=suf[i]+pre[i-1];
                tmp[i][r]=w;
            }
        }
        for(int i=1;i<=n;++i){
            int now=-inf;
            for(int j=m;j>=l;--j){
                now=max(now,tmp[i][j]);
                c[i][j]=max(c[i][j],now);
            }
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            int t=c[i][j]+P-a[i][j];
            t=max(t,U[i-1]);
            t=max(t,D[i+1]);
            t=max(t,L[j-1]);
            t=max(t,R[j+1]);
            ans=min(ans,t);
        }
    }
    cout<<ans<<'\n';
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(cin>>n>>m>>P)Solve();
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3616kb

input:

3 3 -10
-100 4 4
4 -10 4
4 4 1
3 3 -1
-2 -2 -2
-2 -2 -2
-2 -2 -2

output:

8
-2

result:

ok 2 lines

Test #2:

score: 0
Accepted
time: 14ms
memory: 3960kb

input:

150 150 -1000
43 -832 286 960 955 -713 387 -6 -542 -664 618 473 -628 225 -682 -223 219 -28 269 -799 -658 -263 791 736 32 33 -652 613 -676 153 223 -615 -495 -742 -529 -365 -531 674 764 546 926 815 -691 240 -98 -183 -306 -914 263 -714 -632 364 948 462 75 -724 143 -736 236 169 342 974 -412 -535 -468 27...

output:

78124
1319
3276
5931
1109
6509
238
3559
2751
2030
3302
4653
2141
1932
6174
844
6719
6732
1886
2656
3430
4020
893
790
585
2635
3772
6120
9976
3000
3557
20
1460
2173
50
657
1932
2406
2689
2248
1229
288
1640
3763
2613
731
3075
21
2297
1022
49
1147
1886
8002
2554
2263
1506
1710
896
2514
1120
4863
-693
2...

result:

ok 114 lines