#include<bits/stdc++.h>
using namespace std;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int n, m, k;
cin >> n >> m >> k;
vector<vector<long long>> A;
vector<long long> V;
for (int i = 0; i < n; i++) {
bool isA = false;
vector<long long> a(m);
for (int j = 0; j < m; j++) {
long long aij;
cin >> aij;
a[j] = aij;
if (j > 0 && aij > a[j-1]) {
isA = true;
}
}
if (isA) {
A.push_back(a);
} else {
for (int j = 0; j < m; j++) {
V.push_back(a[j]);
}
}
}
sort(V.begin(), V.end(), greater<long long>());
for (int i = 1; i < V.size(); i++) {
V[i] += V[i-1];
}
vector<vector<long long>> ts(A.size(), vector<long long>(m+1, 0LL));
for (int i = 0; i < A.size(); i++) {
long long s = 0LL;
for (int j = 1; j <= m; j++) {
s += A[i][j-1];
ts[i][j] = s;
}
}
sort(ts.begin(), ts.end(), [m](const vector<long long>& a, const vector<long long>& b)
{
return a[m] >= b[m];
});
vector<multiset<long long>> ms(m, multiset<long long>());
for (int i = 0; i < ts.size(); i++) {
for (int j = 1; j < m; j++) {
ms[j].insert(-ts[i][j]);
}
}
long long As = 0LL;
long long max_value = 0LL;
for (int i = 0; i <= min(k, (int) ts.size() * m); i++) {
int rem = i % m;
long long value = 0LL;
if (rem != 0) {
long long max_i = -(*(ms[rem].lower_bound(-ts[0][m] - 1LL)));
ms[rem].erase(-ts[i / m][rem]);
value += max_i;
} else if (i != 0 && rem == 0) {
As += ts[i / m - 1][m];
}
value += As;
if (k - i <= V.size() && k - i >= 1) {
long long Vp = V[k - i - 1];
value += Vp;
max_value = max(value, max_value);
}
if (k == i) {
max_value = max(value, max_value);
}
}
cout << max_value;
}
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 100 | #include<bits/stdc++.h> using namespace std; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n, m, k; cin >> n >> m >> k; vector<vector<long long>> A; vector<long long> V; for (int i = 0; i < n; i++) { bool isA = false; vector<long long> a(m); for (int j = 0; j < m; j++) { long long aij; cin >> aij; a[j] = aij; if (j > 0 && aij > a[j-1]) { isA = true; } } if (isA) { A.push_back(a); } else { for (int j = 0; j < m; j++) { V.push_back(a[j]); } } } sort(V.begin(), V.end(), greater<long long>()); for (int i = 1; i < V.size(); i++) { V[i] += V[i-1]; } vector<vector<long long>> ts(A.size(), vector<long long>(m+1, 0LL)); for (int i = 0; i < A.size(); i++) { long long s = 0LL; for (int j = 1; j <= m; j++) { s += A[i][j-1]; ts[i][j] = s; } } sort(ts.begin(), ts.end(), [m](const vector<long long>& a, const vector<long long>& b) { return a[m] >= b[m]; }); vector<multiset<long long>> ms(m, multiset<long long>()); for (int i = 0; i < ts.size(); i++) { for (int j = 1; j < m; j++) { ms[j].insert(-ts[i][j]); } } long long As = 0LL; long long max_value = 0LL; for (int i = 0; i <= min(k, (int) ts.size() * m); i++) { int rem = i % m; long long value = 0LL; if (rem != 0) { long long max_i = -(*(ms[rem].lower_bound(-ts[0][m] - 1LL))); ms[rem].erase(-ts[i / m][rem]); value += max_i; } else if (i != 0 && rem == 0) { As += ts[i / m - 1][m]; } value += As; if (k - i <= V.size() && k - i >= 1) { long long Vp = V[k - i - 1]; value += Vp; max_value = max(value, max_value); } if (k == i) { max_value = max(value, max_value); } } cout << max_value; } |
English