#include "bits/stdc++.h"
using namespace std;
using ll = long long;
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n, m, k;
cin >> n >> m >> k;
vector <deque <ll>> desc;
vector <vector <ll>> asc;
for (int i = 0; i < n; i++) {
bool descending = false;
deque <ll> tmp;
for (int j = 0; j < m; j++) {
ll a;
cin >> a;
if (j && tmp.back() > a) descending = true;
tmp.push_back(a);
}
if (descending) {
desc.push_back(tmp);
} else {
vector <ll> v;
while (!tmp.empty()) {
v.push_back(tmp.front());
tmp.pop_front();
}
asc.push_back(v);
}
}
vector <ll> ascending(asc.size() * m + 1, 0), descending(desc.size() * m + 1, 0);
priority_queue <pair <ll, int>> pq;
for (int i = 0; i < desc.size(); i++) {
pq.push({desc[i].front(), i});
}
for (int i = 1; i < descending.size(); i++) {
descending[i] = descending[i - 1];
auto [a, idx] = pq.top();
pq.pop();
descending[i] += a;
desc[idx].pop_front();
if (!desc[idx].empty()) pq.push({desc[idx].front(), idx});
}
for (int i = 0; i < asc.size(); i++) {
for (int j = 1; j < m; j++) {
asc[i][j] += asc[i][j - 1];
}
}
vector <set <pair <ll, int>>> st(m);
for (int i = 0; i < asc.size(); i++) {
for (int j = 0; j < m; j++) {
int x = j + 1;
if (x == m) x = 0;
st[x].insert({asc[i][j], i});
}
}
ll full = 0;
for (int i = 1; i < ascending.size(); i++) {
int x = (i % m);
auto [a, idx] = *(--st[x].end());
ascending[i] = full + a;
if (x == 0) {
full += a;
for (int j = 0; j < st.size(); j++) {
x = (j ? j - 1 : m - 1);
st[j].erase({asc[idx][x], idx});
}
}
}
ll ans = 0;
for (int i = 0; i < ascending.size(); i++) {
int j = k - i;
if (j >= descending.size()) continue;
ans = max(ans, ascending[i] + descending[j]);
}
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 | #include "bits/stdc++.h" using namespace std; using ll = long long; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, k; cin >> n >> m >> k; vector <deque <ll>> desc; vector <vector <ll>> asc; for (int i = 0; i < n; i++) { bool descending = false; deque <ll> tmp; for (int j = 0; j < m; j++) { ll a; cin >> a; if (j && tmp.back() > a) descending = true; tmp.push_back(a); } if (descending) { desc.push_back(tmp); } else { vector <ll> v; while (!tmp.empty()) { v.push_back(tmp.front()); tmp.pop_front(); } asc.push_back(v); } } vector <ll> ascending(asc.size() * m + 1, 0), descending(desc.size() * m + 1, 0); priority_queue <pair <ll, int>> pq; for (int i = 0; i < desc.size(); i++) { pq.push({desc[i].front(), i}); } for (int i = 1; i < descending.size(); i++) { descending[i] = descending[i - 1]; auto [a, idx] = pq.top(); pq.pop(); descending[i] += a; desc[idx].pop_front(); if (!desc[idx].empty()) pq.push({desc[idx].front(), idx}); } for (int i = 0; i < asc.size(); i++) { for (int j = 1; j < m; j++) { asc[i][j] += asc[i][j - 1]; } } vector <set <pair <ll, int>>> st(m); for (int i = 0; i < asc.size(); i++) { for (int j = 0; j < m; j++) { int x = j + 1; if (x == m) x = 0; st[x].insert({asc[i][j], i}); } } ll full = 0; for (int i = 1; i < ascending.size(); i++) { int x = (i % m); auto [a, idx] = *(--st[x].end()); ascending[i] = full + a; if (x == 0) { full += a; for (int j = 0; j < st.size(); j++) { x = (j ? j - 1 : m - 1); st[j].erase({asc[idx][x], idx}); } } } ll ans = 0; for (int i = 0; i < ascending.size(); i++) { int j = k - i; if (j >= descending.size()) continue; ans = max(ans, ascending[i] + descending[j]); } cout << ans << '\n'; } |
English