#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
vector<i64> prefix_sums(vector<i64> a) {
vector<i64> s = {0};
for (i64 x: a) s.push_back(s.back() + x);
return s;
}
vector<i64> solve_up(vector<vector<i64>> a) {
if (a.empty()) return {0};
int n = a.size(), m = a[0].size();
for (auto &v: a) v = prefix_sums(v);
sort(begin(a), end(a), [&](const auto &s, const auto &t) {
return s.back() > t.back();
});
vector<i64> sum(n+1);
for (int i = 0; i < n; i++) {
sum[i+1] = sum[i] + a[i][m];
}
vector<i64> dp(n*m+1);
for (int r = 0; r < m; r++) {
vector<i64> pre(n+1, -1e18), suf(n+1, -1e18);
for (int i = 0; i < n; i++) {
pre[i+1] = max(pre[i], a[i][r] - a[i][m]);
}
for (int i = n-1; i >= 0; i--) {
suf[i] = max(suf[i+1], a[i][r]);
}
for (int t = 0; t < n; t++) {
dp[t*m+r] = max(sum[t] + suf[t], sum[t+1] + pre[t]);
}
}
dp[n*m] = sum[n];
return dp;
}
vector<i64> solve_dn(vector<vector<i64>> a) {
vector<i64> b;
for (auto &v: a) copy(begin(v), end(v), back_inserter(b));
sort(begin(b), end(b), greater<>());
return prefix_sums(b);
}
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<i64>> up, dn;
while (n--) {
vector<i64> a(m);
for (i64 &x: a) cin >> x;
(a[0] < a[m-1] ? up : dn).push_back(a);
}
auto a = solve_up(up);
auto b = solve_dn(dn);
int na = a.size(), nb = b.size();
i64 res = 0;
for (int i = 0; i < na; i++) {
int j = k-i;
if (0 <= j && j < nb) res = max(res, a[i]+b[j]);
}
cout << res << '\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 | #include <bits/stdc++.h> using namespace std; using i64 = long long; vector<i64> prefix_sums(vector<i64> a) { vector<i64> s = {0}; for (i64 x: a) s.push_back(s.back() + x); return s; } vector<i64> solve_up(vector<vector<i64>> a) { if (a.empty()) return {0}; int n = a.size(), m = a[0].size(); for (auto &v: a) v = prefix_sums(v); sort(begin(a), end(a), [&](const auto &s, const auto &t) { return s.back() > t.back(); }); vector<i64> sum(n+1); for (int i = 0; i < n; i++) { sum[i+1] = sum[i] + a[i][m]; } vector<i64> dp(n*m+1); for (int r = 0; r < m; r++) { vector<i64> pre(n+1, -1e18), suf(n+1, -1e18); for (int i = 0; i < n; i++) { pre[i+1] = max(pre[i], a[i][r] - a[i][m]); } for (int i = n-1; i >= 0; i--) { suf[i] = max(suf[i+1], a[i][r]); } for (int t = 0; t < n; t++) { dp[t*m+r] = max(sum[t] + suf[t], sum[t+1] + pre[t]); } } dp[n*m] = sum[n]; return dp; } vector<i64> solve_dn(vector<vector<i64>> a) { vector<i64> b; for (auto &v: a) copy(begin(v), end(v), back_inserter(b)); sort(begin(b), end(b), greater<>()); return prefix_sums(b); } int main() { int n, m, k; cin >> n >> m >> k; vector<vector<i64>> up, dn; while (n--) { vector<i64> a(m); for (i64 &x: a) cin >> x; (a[0] < a[m-1] ? up : dn).push_back(a); } auto a = solve_up(up); auto b = solve_dn(dn); int na = a.size(), nb = b.size(); i64 res = 0; for (int i = 0; i < na; i++) { int j = k-i; if (0 <= j && j < nb) res = max(res, a[i]+b[j]); } cout << res << '\n'; } |
English