1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include<bits/stdc++.h> #define FIN freopen("./J.in","r",stdin) using namespace std; typedef long long ll; const ll maxn(1e3+5); ll T,ans,n,m,c[maxn][maxn],d[maxn],pre_c[maxn][maxn],pre_d[maxn],dp[maxn][maxn][12],flag,maxc,now; void makermq(ll jn,ll n,ll b[]) { ll i,j; for(i=1;i<=n;i++) dp[jn][i][0]=b[i]; for(j=1;(1<<j)<=n;j++) for(i=1;i+(1<<j)-1<=n;i++) dp[jn][i][j]=min(dp[jn][i][j-1],dp[jn][i+(1<<(j-1))][j-1]); } ll rmq(ll jn,ll s,ll v) { ll k=(ll)(log((v-s+1)*1.0)/log(2.0)); return min(dp[jn][s][k],dp[jn][v-(1<<k)+1][k]); } int main(){ #ifndef ONLINE_JUDGE FIN; #endif ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>T; for(ll t=1;t<=T;t++){ ans=0; cin>>n>>m; for(ll i=1;i<=n;i++){ for(ll j=1;j<=m;j++){ cin>>c[i][j]; pre_c[i][j]=pre_c[i][j-1]+c[i][j]; } makermq(i,m,pre_c[i]); } for(ll i=1;i<=m;i++){ cin>>d[i]; pre_d[i]=pre_d[i-1]+d[i]; } for(ll i=0;i<m;i++){ flag=1,maxc=-1e17-5,now=pre_d[i]; for(ll j=1;j<=n;j++){ now-=pre_c[j][i]; } for(ll j=1;j<=n;j++){ ll tmp=rmq(j,i+1,m); if(tmp-pre_c[j][i]>0&&flag){ flag=0; }else if(tmp-pre_c[j][i]<0){ now-=tmp-pre_c[j][i]; maxc=max(maxc,tmp-pre_c[j][i]); } } if(flag){ now+=maxc; } ans=max(ans,now); } now=pre_d[m]; for(ll i=1;i<=n;i++){ now-=pre_c[i][m]; } ans=max(ans,now); cout<<"Case #"<<t<<": "<<ans<<"\n"; } }
|