#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ve vector
#define fi first
#define se second
#define pb push_back
#define all(x) begin(x), end(x)
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
void solve(){
int n, m, k;
cin >> n >> m >> k;
ve<ve<ll> > ic;
ve<ll> dc;
for(int i = 0; i < n; i++){
ve<ll> v(m);
for(auto& j : v)
cin >> j;
bool isic = 1;
for(int j = 1; j < m; j++)
isic &= v[j] >= v[j-1];
if(isic){
ic.push_back(v);
}
else{
for(auto j : v)
dc.push_back(j);
}
}
sort(all(dc), greater<ll>());
ve<ll> pdc = dc;
pdc.insert(pdc.begin(), 0);
for(int i = 1; i < pdc.size(); i++)
pdc[i] += pdc[i-1];
n = ic.size();
{
ve<ll> sums(n, 0);
for(int i = 0; i < n; i++)
for(auto j : ic[i])
sums[i] += j;
ve<int> o(n);
iota(all(o), 0);
sort(all(o), [&](int a, int b){
return sums[a] > sums[b];
});
ve<ve<ll> > nic(n);
for(int i = 0; i < n; i++){
nic[i] = ic[o[i]];
}
ic.swap(nic);
}
ve<ve<ll> > sums(m + 1, ve<ll>(n, 0));
for(int i = 1; i <= m; i++)
for(int j = 0; j < n; j++)
sums[i][j] = sums[i-1][j] + ic[j][i-1];
ve<ve<int> > mxi(m+1, ve<int>(n));
for(int it = 0; it <= m; it++){
if(n)
mxi[it].back() = n-1;
for(int i = n-2; i >= 0; i--){
if(sums[it][i] > sums[it][mxi[it][i+1]])
mxi[it][i] = i;
else mxi[it][i] = mxi[it][i+1];
}
}
ll sum = 0;
ll res = 0;
auto upd = [&](ll sum, int cnt){
cnt = k - cnt;
if(cnt < pdc.size()){
res = max(res, pdc[cnt] + sum);
}
};
upd(0, 0);
for(int c1 = 0; c1 < n && c1*m <= k; c1++){
for(int c2 = 0; c2 <= m && c2 + c1*m <= k; c2++){
ll sum2 = sums[c2][mxi[c2][c1]];
upd(sum + sum2, c1*m + c2);
if(mxi[c2][0] < c1){
int x = mxi[c2][0];
upd(sum - sums[m][x] + sums[c2][x] + sums[m][c1], c1*m + c2);
}
}
if(c1 != n)
sum += sums[m][c1];
}
cout << res << "\n";
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int T = 1;
// cin >> T;
while(T--) solve();
}
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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <bits/stdc++.h> using namespace std; #define ll long long #define ve vector #define fi first #define se second #define pb push_back #define all(x) begin(x), end(x) typedef pair<int, int> pii; typedef pair<ll, ll> pll; void solve(){ int n, m, k; cin >> n >> m >> k; ve<ve<ll> > ic; ve<ll> dc; for(int i = 0; i < n; i++){ ve<ll> v(m); for(auto& j : v) cin >> j; bool isic = 1; for(int j = 1; j < m; j++) isic &= v[j] >= v[j-1]; if(isic){ ic.push_back(v); } else{ for(auto j : v) dc.push_back(j); } } sort(all(dc), greater<ll>()); ve<ll> pdc = dc; pdc.insert(pdc.begin(), 0); for(int i = 1; i < pdc.size(); i++) pdc[i] += pdc[i-1]; n = ic.size(); { ve<ll> sums(n, 0); for(int i = 0; i < n; i++) for(auto j : ic[i]) sums[i] += j; ve<int> o(n); iota(all(o), 0); sort(all(o), [&](int a, int b){ return sums[a] > sums[b]; }); ve<ve<ll> > nic(n); for(int i = 0; i < n; i++){ nic[i] = ic[o[i]]; } ic.swap(nic); } ve<ve<ll> > sums(m + 1, ve<ll>(n, 0)); for(int i = 1; i <= m; i++) for(int j = 0; j < n; j++) sums[i][j] = sums[i-1][j] + ic[j][i-1]; ve<ve<int> > mxi(m+1, ve<int>(n)); for(int it = 0; it <= m; it++){ if(n) mxi[it].back() = n-1; for(int i = n-2; i >= 0; i--){ if(sums[it][i] > sums[it][mxi[it][i+1]]) mxi[it][i] = i; else mxi[it][i] = mxi[it][i+1]; } } ll sum = 0; ll res = 0; auto upd = [&](ll sum, int cnt){ cnt = k - cnt; if(cnt < pdc.size()){ res = max(res, pdc[cnt] + sum); } }; upd(0, 0); for(int c1 = 0; c1 < n && c1*m <= k; c1++){ for(int c2 = 0; c2 <= m && c2 + c1*m <= k; c2++){ ll sum2 = sums[c2][mxi[c2][c1]]; upd(sum + sum2, c1*m + c2); if(mxi[c2][0] < c1){ int x = mxi[c2][0]; upd(sum - sums[m][x] + sums[c2][x] + sums[m][c1], c1*m + c2); } } if(c1 != n) sum += sums[m][c1]; } cout << res << "\n"; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); int T = 1; // cin >> T; while(T--) solve(); } |
English