#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define st first
#define nd second
void solve() {
int n, m, k; cin >> n >> m >> k;
vector<ll> sto(m);
vector<ll> all_B;
vector<vector<ll>> A;
for (int i = 0; i < n; i++) {
bool type_B = false;
for (int j = 0; j < m; j++) {
cin >> sto[j];
if (j && (sto[j-1] > sto[j])) type_B = true;
}
if (type_B) {
// cout << i << '\n';
for (ll x: sto) all_B.push_back(x);
}
else {
vector<ll> pref_A(m+1);
for(int j = 1; j <= m; j++) pref_A[j] = pref_A[j-1] + sto[j-1];
A.push_back(pref_A);
}
}
sort(all_B.begin(), all_B.end(), greater<ll>());
vector<ll> pref_B(all_B.size()+1);
for (int i = 1; i <= all_B.size(); i++) {
pref_B[i] = pref_B[i-1] + all_B[i-1];
}
int l = A.size();
A.push_back(vector<ll>(m+1, 0));
vector<int> order(A.size());
for (int i = 0; i < order.size(); i++) order[i] = i;
sort(order.begin(), order.end(), [&A](int a, int b) {
if (A[a].back() != A[b].back()) return A[a].back() > A[b].back();
return a < b;
});
vector<vector<ll>> T1(l+1, vector<ll>(m+1, -1e18));
vector<vector<ll>> T2 = T1;
for (int i = 0; i <= m; i++) T2[0][i] = 0;
for (int i = 1; i <= l; i++) {
for (int j = 0; j <= m; j++) {
T1[i][j] = max(T1[i-1][j], A[order[i-1]][j] - A[order[i-1]][m]);
T2[i][j] = max(T2[i-1][j], A[order[l-i]][j]);
}
}
vector<ll> pref_A(l+1);
for (int i = 1; i <= l; i++) {
pref_A[i] = pref_A[i-1]+A[order[i-1]][m];
}
ll ans = 0;
// cout << "B size: " <<all_B.size() << '\n';
for (int i = max(0, k - (int)all_B.size()); i <= min(k,l*m); i++) {
// cout << i << ' ';
ll sum = pref_B[k-i];
int x = i/m;
int r = i%m;
// cout << pref_A[x] << '\n';
sum += pref_A[x] + max(T2[l-x][r], T1[x][r] + A[order[x]][m]);
// cout << sum << '\n';
ans = max(ans, sum);
}
cout << ans << '\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define st first #define nd second void solve() { int n, m, k; cin >> n >> m >> k; vector<ll> sto(m); vector<ll> all_B; vector<vector<ll>> A; for (int i = 0; i < n; i++) { bool type_B = false; for (int j = 0; j < m; j++) { cin >> sto[j]; if (j && (sto[j-1] > sto[j])) type_B = true; } if (type_B) { // cout << i << '\n'; for (ll x: sto) all_B.push_back(x); } else { vector<ll> pref_A(m+1); for(int j = 1; j <= m; j++) pref_A[j] = pref_A[j-1] + sto[j-1]; A.push_back(pref_A); } } sort(all_B.begin(), all_B.end(), greater<ll>()); vector<ll> pref_B(all_B.size()+1); for (int i = 1; i <= all_B.size(); i++) { pref_B[i] = pref_B[i-1] + all_B[i-1]; } int l = A.size(); A.push_back(vector<ll>(m+1, 0)); vector<int> order(A.size()); for (int i = 0; i < order.size(); i++) order[i] = i; sort(order.begin(), order.end(), [&A](int a, int b) { if (A[a].back() != A[b].back()) return A[a].back() > A[b].back(); return a < b; }); vector<vector<ll>> T1(l+1, vector<ll>(m+1, -1e18)); vector<vector<ll>> T2 = T1; for (int i = 0; i <= m; i++) T2[0][i] = 0; for (int i = 1; i <= l; i++) { for (int j = 0; j <= m; j++) { T1[i][j] = max(T1[i-1][j], A[order[i-1]][j] - A[order[i-1]][m]); T2[i][j] = max(T2[i-1][j], A[order[l-i]][j]); } } vector<ll> pref_A(l+1); for (int i = 1; i <= l; i++) { pref_A[i] = pref_A[i-1]+A[order[i-1]][m]; } ll ans = 0; // cout << "B size: " <<all_B.size() << '\n'; for (int i = max(0, k - (int)all_B.size()); i <= min(k,l*m); i++) { // cout << i << ' '; ll sum = pref_B[k-i]; int x = i/m; int r = i%m; // cout << pref_A[x] << '\n'; sum += pref_A[x] + max(T2[l-x][r], T1[x][r] + A[order[x]][m]); // cout << sum << '\n'; ans = max(ans, sum); } cout << ans << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } } |
English