#include<bits/stdc++.h>
using namespace std;
constexpr int MAXN = 3e5+123;
using ll = long long;
using pii = pair<ll, int>;
ll nale[MAXN];
ll pnale[MAXN];
ll snale[MAXN];
set<pii, greater<pii>> maxM[MAXN];
bool isle[MAXN];
ll dp[MAXN];
ll minSuf[MAXN];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n{}, m{}, k{};
cin >> n >> m >> k;
for(int i = 0; i < MAXN; ++i) minSuf[i] = 1e18+1;
auto getIdx = [n, m](int i, int j) {
return (i-1)*m+j;
};
for(int i{1}; i <= n; ++i) {
for(int j{1}; j <= m; ++j) {
cin >> nale[getIdx(i, j)];
}
}
vector<ll> ge;
int cntle{};
for(int i{1}; i <= n; ++i) {
for(int j{2}; j <= m; ++j) {
if(nale[getIdx(i, j)] > nale[getIdx(i, j-1)]) {
isle[i] = 1;
}
}
if(!isle[i]) {
for(int j{1}; j <= m; ++j) {
ge.emplace_back(nale[getIdx(i, j)]);
}
}
else {
ll sum{};
for(int j{1}; j <= m; ++j) {
sum += nale[getIdx(i, j)];
pnale[getIdx(i, j)] = sum;
maxM[j].insert({sum, i});
cntle++;
}
sum = 0;
for(int j = m; j >= 1; --j) {
sum += nale[getIdx(i, j)];
snale[getIdx(i, j)] = sum;
}
}
}
if(cntle) {
for(int j = 1; j <= m-1; ++j) {
auto &[sum ,id] = (*maxM[j].begin());
dp[j] = sum;
}
}
for(int i = 1; i <= n-1; ++i) {
dp[i*m] = dp[(i-1)*m];
if(i > cntle) continue;
auto [sum, id] = (*maxM[m].begin());
for(int j = 1; j <= m; ++j) {
maxM[j].erase({pnale[getIdx(id, j)], id});
}
dp[i*m] += sum;
for(int j = 1; j <= m; ++j) {
minSuf[j] = min(minSuf[j], snale[getIdx(id, j)]);
}
for(int j = 1; j <= m-1; ++j) {
auto &[sum1, id1] = (*maxM[j].begin());
auto &[sum2, id2] = (*maxM[m].begin());
dp[i*m+j] = dp[i*m];
dp[i*m+j] += max(sum1, sum2-minSuf[j+1]);
}
}
dp[n*m] = dp[(n-1)*m];
if(maxM[m].size()) {
auto &[sum, id] = (*maxM[m].begin());
dp[n*m] += sum;
}
ll ans{dp[k]};
ll sumG{};
sort(ge.begin(), ge.end());
for(int i = 0; i <= k; ++i) {
ans = max(ans, dp[k-i] + sumG);
if(!ge.size()) break;
sumG += ge.back();
ge.pop_back();
}
cout << ans << '\n';
}
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 | #include<bits/stdc++.h> using namespace std; constexpr int MAXN = 3e5+123; using ll = long long; using pii = pair<ll, int>; ll nale[MAXN]; ll pnale[MAXN]; ll snale[MAXN]; set<pii, greater<pii>> maxM[MAXN]; bool isle[MAXN]; ll dp[MAXN]; ll minSuf[MAXN]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n{}, m{}, k{}; cin >> n >> m >> k; for(int i = 0; i < MAXN; ++i) minSuf[i] = 1e18+1; auto getIdx = [n, m](int i, int j) { return (i-1)*m+j; }; for(int i{1}; i <= n; ++i) { for(int j{1}; j <= m; ++j) { cin >> nale[getIdx(i, j)]; } } vector<ll> ge; int cntle{}; for(int i{1}; i <= n; ++i) { for(int j{2}; j <= m; ++j) { if(nale[getIdx(i, j)] > nale[getIdx(i, j-1)]) { isle[i] = 1; } } if(!isle[i]) { for(int j{1}; j <= m; ++j) { ge.emplace_back(nale[getIdx(i, j)]); } } else { ll sum{}; for(int j{1}; j <= m; ++j) { sum += nale[getIdx(i, j)]; pnale[getIdx(i, j)] = sum; maxM[j].insert({sum, i}); cntle++; } sum = 0; for(int j = m; j >= 1; --j) { sum += nale[getIdx(i, j)]; snale[getIdx(i, j)] = sum; } } } if(cntle) { for(int j = 1; j <= m-1; ++j) { auto &[sum ,id] = (*maxM[j].begin()); dp[j] = sum; } } for(int i = 1; i <= n-1; ++i) { dp[i*m] = dp[(i-1)*m]; if(i > cntle) continue; auto [sum, id] = (*maxM[m].begin()); for(int j = 1; j <= m; ++j) { maxM[j].erase({pnale[getIdx(id, j)], id}); } dp[i*m] += sum; for(int j = 1; j <= m; ++j) { minSuf[j] = min(minSuf[j], snale[getIdx(id, j)]); } for(int j = 1; j <= m-1; ++j) { auto &[sum1, id1] = (*maxM[j].begin()); auto &[sum2, id2] = (*maxM[m].begin()); dp[i*m+j] = dp[i*m]; dp[i*m+j] += max(sum1, sum2-minSuf[j+1]); } } dp[n*m] = dp[(n-1)*m]; if(maxM[m].size()) { auto &[sum, id] = (*maxM[m].begin()); dp[n*m] += sum; } ll ans{dp[k]}; ll sumG{}; sort(ge.begin(), ge.end()); for(int i = 0; i <= k; ++i) { ans = max(ans, dp[k-i] + sumG); if(!ge.size()) break; sumG += ge.back(); ge.pop_back(); } cout << ans << '\n'; } |
English