#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
ll N, M, K, SSS, inf=1e17;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> K;
vector<ll> v;
vector < pair < ll, vector < ll>>> ros;
for (int i = 0; i < N; i++) {
bool gro = 0, mal = 0;
ll pop = -1, sum = 0;
vector<ll> akt(M);
for (int j = 0; j < M; j++) {
cin >> akt[j];
SSS += akt[j];
sum += akt[j];
if (!j) {
pop = akt[j];
continue;
}
if (akt[j] > pop) gro = 1;
if (akt[j] < pop) mal = 1;
pop = akt[j];
}
if (!gro) {
for (auto j: akt) v.push_back(j);
continue;
}
// gdz.push_back({sum, ros.size()});
ros.push_back({sum, akt});
//ros[ros.size()-1].push_back(sum);
}
sort(v.rbegin(), v.rend());
vector<ll> pref(v.size() + 1);
for (int i = 0; i < v.size(); i++) pref[i + 1] = pref[i] + v[i];
sort(ros.begin(), ros.end(), greater());
vector<ll> pr(ros.size() + 1);
for (int i = 0; i < ros.size(); i++) pr[i + 1] = pr[i] + ros[i].f;
vector <vector<ll>> px(ros.size(), vector<ll>(M, -inf)), sex(ros.size(), vector<ll>(M, -inf));
for (int i = 0; i < ros.size(); i++) {
ll cur = 0;
for (int r = 1; r < M; r++) {
cur += ros[i].s[r - 1];
ll val = cur - ros[i].f;
if (i == 0) px[i][r] = val;
else px[i][r] = max(px[i - 1][r], val);
}
}
for (int i = ros.size() - 1; i >= 0; i--) {
ll cur = 0;
for (int r = 1; r < M; r++) {
cur += ros[i].s[r - 1];
if (i == ros.size() - 1) sex[i][r] = cur;
else sex[i][r] = max(sex[i + 1][r], cur);
}
}
ll ans = -1;
for (int i = 0; i <= ros.size(); i++) {
ll sm = K - i * M;
if (sm >= 0 && sm <= v.size()) ans = max(ans, pr[i] + pref[sm]);
for (ll x = 1; x < M; x++) {
sm = K - i * M - x;
if (sm >= 0 && sm <= v.size()) {
if (i) ans = max(ans, pr[i] + px[i - 1][x] + pref[sm]);
if (i < ros.size()) ans = max(ans, pr[i] + sex[i][x] + pref[sm]);
}
}
}
cout << ans;
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 | #include <bits/stdc++.h> using namespace std; #define ll long long #define f first #define s second ll N, M, K, SSS, inf=1e17; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> M >> K; vector<ll> v; vector < pair < ll, vector < ll>>> ros; for (int i = 0; i < N; i++) { bool gro = 0, mal = 0; ll pop = -1, sum = 0; vector<ll> akt(M); for (int j = 0; j < M; j++) { cin >> akt[j]; SSS += akt[j]; sum += akt[j]; if (!j) { pop = akt[j]; continue; } if (akt[j] > pop) gro = 1; if (akt[j] < pop) mal = 1; pop = akt[j]; } if (!gro) { for (auto j: akt) v.push_back(j); continue; } // gdz.push_back({sum, ros.size()}); ros.push_back({sum, akt}); //ros[ros.size()-1].push_back(sum); } sort(v.rbegin(), v.rend()); vector<ll> pref(v.size() + 1); for (int i = 0; i < v.size(); i++) pref[i + 1] = pref[i] + v[i]; sort(ros.begin(), ros.end(), greater()); vector<ll> pr(ros.size() + 1); for (int i = 0; i < ros.size(); i++) pr[i + 1] = pr[i] + ros[i].f; vector <vector<ll>> px(ros.size(), vector<ll>(M, -inf)), sex(ros.size(), vector<ll>(M, -inf)); for (int i = 0; i < ros.size(); i++) { ll cur = 0; for (int r = 1; r < M; r++) { cur += ros[i].s[r - 1]; ll val = cur - ros[i].f; if (i == 0) px[i][r] = val; else px[i][r] = max(px[i - 1][r], val); } } for (int i = ros.size() - 1; i >= 0; i--) { ll cur = 0; for (int r = 1; r < M; r++) { cur += ros[i].s[r - 1]; if (i == ros.size() - 1) sex[i][r] = cur; else sex[i][r] = max(sex[i + 1][r], cur); } } ll ans = -1; for (int i = 0; i <= ros.size(); i++) { ll sm = K - i * M; if (sm >= 0 && sm <= v.size()) ans = max(ans, pr[i] + pref[sm]); for (ll x = 1; x < M; x++) { sm = K - i * M - x; if (sm >= 0 && sm <= v.size()) { if (i) ans = max(ans, pr[i] + px[i - 1][x] + pref[sm]); if (i < ros.size()) ans = max(ans, pr[i] + sex[i][x] + pref[sm]); } } } cout << ans; return 0; } |
English