#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n, m, k;
cin >> n >> m >> k;
vector<vector<ll>> incs;
vector<ll> decs;
for(ll i = 0LL; i < n; i++) {
vector<ll> a;
for(ll j = 0LL; j < m; j++) {
ll tmp;
cin >> tmp;
a.push_back(tmp);
}
if(a.front() < a.back()) {
incs.push_back(a);
} else {
for(auto j: a) {
decs.push_back(j);
}
}
}
sort(decs.begin(), decs.end());
reverse(decs.begin(), decs.end());
vector<ll> ps_blocks;
ps_blocks.push_back(0LL);
for(ll i = 0LL; i < incs.size(); i++) {
for(ll j = 1LL; j < m; j++) {
incs[i][j] += incs[i][j - 1LL];
}
reverse(incs[i].begin(), incs[i].end());
}
sort(incs.begin(), incs.end());
reverse(incs.begin(), incs.end());
for(ll i = incs.size() - 2LL; i >= 0; i--) {
for(ll j = 0LL; j < m; j++) {
incs[i][j] = max(incs[i][j], incs[i + 1][j]);
}
}
for(ll i = 0LL; i < incs.size(); i++) {
reverse(incs[i].begin(), incs[i].end());
ps_blocks.push_back(ps_blocks.back() + incs[i].back());
}
vector<vector<ll>> incs_min = incs;
for(ll i = 0LL; i < incs_min.size(); i++) {
for(ll j = m - 1LL; j > 0; j--) {
incs_min[i][j] -= incs_min[i][j - 1LL];
}
for(ll j = m - 2LL; j >= 0; j--) {
incs_min[i][j] += incs_min[i][j + 1LL];
}
}
for(ll i = 1LL; i < incs_min.size(); i++) {
for(ll j = 0LL; j < m; j++) {
incs_min[i][j] = min(incs_min[i][j], incs_min[i - 1LL][j]);
}
}
for(ll i = 1LL; i < decs.size(); i++) {
decs[i] += decs[i - 1LL];
}
ll ans = 0LL;
for(ll i = 0LL; i <= k; i++) {
ll blocks_count = min((ll)ps_blocks.size() - 1LL, (k - i)/m);
ll prefix_length = min(((ll)ps_blocks.size() - 1LL - blocks_count)*m, k - i - blocks_count*m);
ll leftovers_length = k - blocks_count*m - prefix_length;
ll blocks_res = ps_blocks[min((ll)ps_blocks.size() - 1LL, blocks_count + 1LL)];
ll prefix_res = 0LL;
if(ps_blocks.size() - 1LL - blocks_count > 0LL) {
prefix_res = -incs_min[blocks_count][prefix_length];
}
ll leftovers_res = 0LL;
if(leftovers_length && decs.size()) {
leftovers_res = decs[min(leftovers_length - 1, (ll)decs.size() - 1)];
}
ans = max(ans, blocks_res + prefix_res + leftovers_res);
blocks_res = ps_blocks[blocks_count];
prefix_res = 0LL;
if(prefix_length) {
prefix_res = incs[blocks_count][prefix_length - 1LL];
}
}
cout << ans << "\n";
return 0;
}
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 106 107 108 109 | #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n, m, k; cin >> n >> m >> k; vector<vector<ll>> incs; vector<ll> decs; for(ll i = 0LL; i < n; i++) { vector<ll> a; for(ll j = 0LL; j < m; j++) { ll tmp; cin >> tmp; a.push_back(tmp); } if(a.front() < a.back()) { incs.push_back(a); } else { for(auto j: a) { decs.push_back(j); } } } sort(decs.begin(), decs.end()); reverse(decs.begin(), decs.end()); vector<ll> ps_blocks; ps_blocks.push_back(0LL); for(ll i = 0LL; i < incs.size(); i++) { for(ll j = 1LL; j < m; j++) { incs[i][j] += incs[i][j - 1LL]; } reverse(incs[i].begin(), incs[i].end()); } sort(incs.begin(), incs.end()); reverse(incs.begin(), incs.end()); for(ll i = incs.size() - 2LL; i >= 0; i--) { for(ll j = 0LL; j < m; j++) { incs[i][j] = max(incs[i][j], incs[i + 1][j]); } } for(ll i = 0LL; i < incs.size(); i++) { reverse(incs[i].begin(), incs[i].end()); ps_blocks.push_back(ps_blocks.back() + incs[i].back()); } vector<vector<ll>> incs_min = incs; for(ll i = 0LL; i < incs_min.size(); i++) { for(ll j = m - 1LL; j > 0; j--) { incs_min[i][j] -= incs_min[i][j - 1LL]; } for(ll j = m - 2LL; j >= 0; j--) { incs_min[i][j] += incs_min[i][j + 1LL]; } } for(ll i = 1LL; i < incs_min.size(); i++) { for(ll j = 0LL; j < m; j++) { incs_min[i][j] = min(incs_min[i][j], incs_min[i - 1LL][j]); } } for(ll i = 1LL; i < decs.size(); i++) { decs[i] += decs[i - 1LL]; } ll ans = 0LL; for(ll i = 0LL; i <= k; i++) { ll blocks_count = min((ll)ps_blocks.size() - 1LL, (k - i)/m); ll prefix_length = min(((ll)ps_blocks.size() - 1LL - blocks_count)*m, k - i - blocks_count*m); ll leftovers_length = k - blocks_count*m - prefix_length; ll blocks_res = ps_blocks[min((ll)ps_blocks.size() - 1LL, blocks_count + 1LL)]; ll prefix_res = 0LL; if(ps_blocks.size() - 1LL - blocks_count > 0LL) { prefix_res = -incs_min[blocks_count][prefix_length]; } ll leftovers_res = 0LL; if(leftovers_length && decs.size()) { leftovers_res = decs[min(leftovers_length - 1, (ll)decs.size() - 1)]; } ans = max(ans, blocks_res + prefix_res + leftovers_res); blocks_res = ps_blocks[blocks_count]; prefix_res = 0LL; if(prefix_length) { prefix_res = incs[blocks_count][prefix_length - 1LL]; } } cout << ans << "\n"; return 0; } |
English