#include <bits/stdc++.h>
using namespace std;
#define rep(a, b) for (int a = 0; a < (b); a++)
#define rep1(a, b) for (int a = 1; a <= (b); a++)
#define all(x) (x).begin(), (x).end()
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
const int MOD = 1e9 + 7;
const int LIM = 3e5 + 7;
int n, m, k;
vector<ll> buf;
int incrcnt, decrcnt;
vector<vector<ll>> incr, decr;
vector<vector<ll>> incrprefsum;
ll incrans[LIM], decrans[LIM];
pll pairs[LIM];
ll maxsuff[LIM];
void calcincr() {
rep(rem, m) {
rep(i, incrcnt) pairs[i] = {incrprefsum[i][m-1], incrprefsum[i][rem]-incr[i][rem]};
sort(pairs, pairs+incrcnt, greater{});
maxsuff[incrcnt] = 0;
for (int i = incrcnt-1; i >= 0; i--) maxsuff[i] = max(maxsuff[i+1], pairs[i].second);
ll bestdiff = LLONG_MAX;
ll cur = 0;
rep(i, incrcnt) {
ll ans = cur+maxsuff[i];
if (bestdiff != LLONG_MAX) ans = max(ans, cur+pairs[i].first-bestdiff);
incrans[m*i+rem] = ans;
bestdiff = min(bestdiff, pairs[i].first-pairs[i].second);
cur += pairs[i].first;
}
incrans[m*incrcnt] = cur;
}
}
void calcdecr() {
priority_queue<pair<ll, pii>> Q;
rep(i, decrcnt) Q.push({decr[i][0], {i, 0}});
ll cur = 0;
ll cnt = 0;
while (!Q.empty()) {
auto [val, data] = Q.top();
auto [r, c] = data;
Q.pop();
if (c != m-1) Q.push({decr[r][c+1], {r, c+1}});
cnt++;
cur += val;
decrans[cnt] = cur;
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n >> m >> k;
buf = vector<ll>(m, 0);
ll tot = 0;
rep(i, n) {
rep(j, m) {
cin >> buf[j];
tot += buf[j];
}
bool isincr = true;
rep(j, m-1) isincr &= (buf[j] <= buf[j+1]);
if (isincr) incr.push_back(buf);
else decr.push_back(buf);
}
incrcnt = incr.size();
decrcnt = decr.size();
incrprefsum = vector<vector<ll>>(incrcnt, vector<ll>(m, 0));
rep(i, incrcnt) {
ll sum = 0;
rep(j, m) {
sum += incr[i][j];
incrprefsum[i][j] = sum;
}
}
calcincr();
calcdecr();
// rep(i, n*m+1) cout << incrans[i] << " ";
// cout << "\n";
// rep(i, n*m+1) cout << decrans[i] << " ";
// cout << "\n";
ll ans = 0;
rep(i, k+1) ans = max(ans, incrans[i]+decrans[k-i]);
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 | #include <bits/stdc++.h> using namespace std; #define rep(a, b) for (int a = 0; a < (b); a++) #define rep1(a, b) for (int a = 1; a <= (b); a++) #define all(x) (x).begin(), (x).end() using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const int MOD = 1e9 + 7; const int LIM = 3e5 + 7; int n, m, k; vector<ll> buf; int incrcnt, decrcnt; vector<vector<ll>> incr, decr; vector<vector<ll>> incrprefsum; ll incrans[LIM], decrans[LIM]; pll pairs[LIM]; ll maxsuff[LIM]; void calcincr() { rep(rem, m) { rep(i, incrcnt) pairs[i] = {incrprefsum[i][m-1], incrprefsum[i][rem]-incr[i][rem]}; sort(pairs, pairs+incrcnt, greater{}); maxsuff[incrcnt] = 0; for (int i = incrcnt-1; i >= 0; i--) maxsuff[i] = max(maxsuff[i+1], pairs[i].second); ll bestdiff = LLONG_MAX; ll cur = 0; rep(i, incrcnt) { ll ans = cur+maxsuff[i]; if (bestdiff != LLONG_MAX) ans = max(ans, cur+pairs[i].first-bestdiff); incrans[m*i+rem] = ans; bestdiff = min(bestdiff, pairs[i].first-pairs[i].second); cur += pairs[i].first; } incrans[m*incrcnt] = cur; } } void calcdecr() { priority_queue<pair<ll, pii>> Q; rep(i, decrcnt) Q.push({decr[i][0], {i, 0}}); ll cur = 0; ll cnt = 0; while (!Q.empty()) { auto [val, data] = Q.top(); auto [r, c] = data; Q.pop(); if (c != m-1) Q.push({decr[r][c+1], {r, c+1}}); cnt++; cur += val; decrans[cnt] = cur; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> k; buf = vector<ll>(m, 0); ll tot = 0; rep(i, n) { rep(j, m) { cin >> buf[j]; tot += buf[j]; } bool isincr = true; rep(j, m-1) isincr &= (buf[j] <= buf[j+1]); if (isincr) incr.push_back(buf); else decr.push_back(buf); } incrcnt = incr.size(); decrcnt = decr.size(); incrprefsum = vector<vector<ll>>(incrcnt, vector<ll>(m, 0)); rep(i, incrcnt) { ll sum = 0; rep(j, m) { sum += incr[i][j]; incrprefsum[i][j] = sum; } } calcincr(); calcdecr(); // rep(i, n*m+1) cout << incrans[i] << " "; // cout << "\n"; // rep(i, n*m+1) cout << decrans[i] << " "; // cout << "\n"; ll ans = 0; rep(i, k+1) ans = max(ans, incrans[i]+decrans[k-i]); cout << ans << "\n"; return 0; } |
English