#ifndef UNCLE
#pragma GCC optimize("O3,unroll-loops")
#endif
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,p,q) for(int i=(p); i<=(q); ++i)
#define ROF(i,p,q) for(int i=(p); i>=(q); --i)
#define REP(i,q) for(int i=0; i<(q); ++i)
#define pb push_back
#define as assign
#define rz resize
#define Co const
#define al(X) X.begin(), X.end()
#define ral(X) X.rbegin(), X.rend()
#define sz(X) (int)((X).size())
#define ckmx(a,b) a=max(a,b)
#define ckmn(a,b) a=min(a,b)
#define V vector
typedef long long ll;
typedef long double ld;
typedef mt19937_64 mt;
#ifndef UNCLE
typedef basic_string<bool> vb;
typedef basic_string<int> vi;
typedef basic_string<ll> vl;
#else
typedef V<bool> vb;
typedef V<int> vi;
typedef V<ll> vl;
#endif
constexpr ll INFl=(ll)1e18+14;
constexpr int INFi=1e9+14, MX_N=5e5+14;
int N,M,K;
void Inpt(){
cin>>N>>M>>K;
int n1=0,n2=0;
V<vl> s1,s2;
REP(_,N){
bool is2=1;
vl cv(M,-1);
for(ll &vv:cv) cin>>vv;
FOR(i,1,M-1) if(cv[i]>cv[i-1]){ is2=0; break;}
if(is2) ++n2,s2.pb(cv);
else ++n1,s1.pb(cv);
}
vl dp1(n1*M+1,0),dp2(n2*M+1,0);
if(n1!=0){
REP(i,n1){
FOR(j,1,M-1) s1[i][j]+=s1[i][j-1];
}
sort(al(s1),[&](Co vl &a,Co vl &b){return a.back()>b.back();});
V<vl> mxS(n1,vl(M,0)), mnP(n1,vl(M,INFl));
vl smP(n1,0);
smP[0]=s1[0].back();
REP(k,M) mnP[0][k]=s1[0].back()-s1[0][k], mxS[n1-1][k]=s1[n1-1][k];
FOR(i,1,n1-1){
smP[i]=smP[i-1]+s1[i].back();
REP(k,M) mnP[i][k]=min(mnP[i-1][k],s1[i].back()-s1[i][k]);
}
ROF(i,n1-2,0) REP(k,M) mxS[i][k]=max(mxS[i+1][k],s1[i][k]);
FOR(k,1,K){
if(k>n1*M) break;
if(k%M==0) dp1[k]=smP[k/M-1];
else{
int d=k/M,h=k-d*M;
dp1[k]=(d?smP[d-1]:0)+mxS[d][h-1];
ckmx(dp1[k],smP[d+1-1]-mnP[d+1-1][h-1]);
}
}
}
vl bvc;
REP(i,n2) REP(k,M) bvc.pb(s2[i][k]); //wolne pamieciowo
sort(ral(bvc));
FOR(k,1,n2*M) dp2[k]=dp2[k-1]+bvc[k-1];
ll rs=0;
FOR(k1,0,K){
int k2=K-k1;
if(k1<sz(dp1)&&k2<sz(dp2)) ckmx(rs,dp1[k1]+dp2[k2]);
}
cout<<rs<<"\n";
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
Inpt();
}
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #ifndef UNCLE #pragma GCC optimize("O3,unroll-loops") #endif #include <bits/stdc++.h> using namespace std; #define FOR(i,p,q) for(int i=(p); i<=(q); ++i) #define ROF(i,p,q) for(int i=(p); i>=(q); --i) #define REP(i,q) for(int i=0; i<(q); ++i) #define pb push_back #define as assign #define rz resize #define Co const #define al(X) X.begin(), X.end() #define ral(X) X.rbegin(), X.rend() #define sz(X) (int)((X).size()) #define ckmx(a,b) a=max(a,b) #define ckmn(a,b) a=min(a,b) #define V vector typedef long long ll; typedef long double ld; typedef mt19937_64 mt; #ifndef UNCLE typedef basic_string<bool> vb; typedef basic_string<int> vi; typedef basic_string<ll> vl; #else typedef V<bool> vb; typedef V<int> vi; typedef V<ll> vl; #endif constexpr ll INFl=(ll)1e18+14; constexpr int INFi=1e9+14, MX_N=5e5+14; int N,M,K; void Inpt(){ cin>>N>>M>>K; int n1=0,n2=0; V<vl> s1,s2; REP(_,N){ bool is2=1; vl cv(M,-1); for(ll &vv:cv) cin>>vv; FOR(i,1,M-1) if(cv[i]>cv[i-1]){ is2=0; break;} if(is2) ++n2,s2.pb(cv); else ++n1,s1.pb(cv); } vl dp1(n1*M+1,0),dp2(n2*M+1,0); if(n1!=0){ REP(i,n1){ FOR(j,1,M-1) s1[i][j]+=s1[i][j-1]; } sort(al(s1),[&](Co vl &a,Co vl &b){return a.back()>b.back();}); V<vl> mxS(n1,vl(M,0)), mnP(n1,vl(M,INFl)); vl smP(n1,0); smP[0]=s1[0].back(); REP(k,M) mnP[0][k]=s1[0].back()-s1[0][k], mxS[n1-1][k]=s1[n1-1][k]; FOR(i,1,n1-1){ smP[i]=smP[i-1]+s1[i].back(); REP(k,M) mnP[i][k]=min(mnP[i-1][k],s1[i].back()-s1[i][k]); } ROF(i,n1-2,0) REP(k,M) mxS[i][k]=max(mxS[i+1][k],s1[i][k]); FOR(k,1,K){ if(k>n1*M) break; if(k%M==0) dp1[k]=smP[k/M-1]; else{ int d=k/M,h=k-d*M; dp1[k]=(d?smP[d-1]:0)+mxS[d][h-1]; ckmx(dp1[k],smP[d+1-1]-mnP[d+1-1][h-1]); } } } vl bvc; REP(i,n2) REP(k,M) bvc.pb(s2[i][k]); //wolne pamieciowo sort(ral(bvc)); FOR(k,1,n2*M) dp2[k]=dp2[k-1]+bvc[k-1]; ll rs=0; FOR(k1,0,K){ int k2=K-k1; if(k1<sz(dp1)&&k2<sz(dp2)) ckmx(rs,dp1[k1]+dp2[k2]); } cout<<rs<<"\n"; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); Inpt(); } |
English