#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
int main() {
int n, m, k;
std::cin >> n >> m >> k;
std::vector<std::vector<long long>> stacks(n, std::vector<long long>(m));
std::vector<bool> increasing(n); // false -- biggest on top
for (size_t i = 0; i < n; i++)
{
for (size_t j = 0; j < m; j++)
{
std::cin >> stacks[i][j];
if (j > 0 && stacks[i][j] > stacks[i][j - 1])
increasing[i] = true;
}
}
std::vector<long long> dec_sorted;
for (size_t i = 0; i < n; i++)
{
if (!increasing[i]){
dec_sorted.insert(dec_sorted.end(), stacks[i].begin(), stacks[i].end());
}
}
std::sort(dec_sorted.begin(), dec_sorted.end(), std::greater());
std::vector<long long> dec_prefix_sum(dec_sorted.size() + 1);
dec_prefix_sum[0] = 0;
for (size_t i = 0; i < dec_sorted.size(); i++)
{
dec_prefix_sum[i + 1] = dec_prefix_sum[i] + dec_sorted[i];
}
// ---------
std::vector<std::pair<long long, std::size_t>> inc_stacks_sorted;
std::size_t cnt_stacks_inc = 0;
for (size_t i = 0; i < n; i++)
{
if (increasing[i]){
long long sum = 0;
cnt_stacks_inc++;
for (size_t j = 0; j < m; j++)
{
sum += stacks[i][j];
}
inc_stacks_sorted.push_back({sum, i});
}
}
std::vector<long long> inc_prefix_sum(cnt_stacks_inc * m + 1);
std::sort(inc_stacks_sorted.begin(), inc_stacks_sorted.end(), std::greater());
for (size_t i = 0; i < cnt_stacks_inc; i++)
{
inc_prefix_sum[(i + 1) * m] = inc_prefix_sum[i * m] + inc_stacks_sorted[i].first;
}
std::vector<std::vector<long long>> part_sums(cnt_stacks_inc, std::vector<long long>(m));
std::vector<std::set<std::pair<long long, std::size_t>, std::greater<std::pair<long long, std::size_t>>>> part_sums_sorted(m);
for (size_t i = 0; i < cnt_stacks_inc; i++)
{
long long sum = 0;
std::size_t ind = inc_stacks_sorted[i].second;
for (size_t j = 0; j < m; j++)
{
sum += stacks[ind][j];
part_sums[i][j] = sum;
part_sums_sorted[j].insert({sum, i});
}
}
int last_deleted = -1;
for (size_t i = 0; i < cnt_stacks_inc; i++)
{
for (size_t j = 0; j < m - 1; j++)
{
inc_prefix_sum[i * m + j + 1] = inc_prefix_sum[i * m] + part_sums_sorted[j].begin()->first;
}
if (i + 1 < cnt_stacks_inc && inc_stacks_sorted[i].first != inc_stacks_sorted[i + 1].first) {
for (size_t ind = last_deleted + 1; ind <= i; ind++)
{
for (size_t j = 0; j < m; j++) {
part_sums_sorted[j].erase({part_sums[ind][j], ind});
}
}
last_deleted = i;
}
}
// -----------
// std::cout << "dec prefix sums: ";
// for (size_t i = 0; i < dec_prefix_sum.size(); i++)
// {
// std::cout << dec_prefix_sum[i] << " ";
// }
// std::cout << "\ninc prefix sums: ";
// for (size_t i = 0; i < inc_prefix_sum.size(); i++)
// {
// std::cout << inc_prefix_sum[i] << " ";
// }
// std::cout << "\n";
long long max = 0;
for (size_t i = k - (dec_prefix_sum.size() - 1); i <= std::min((std::size_t)k, cnt_stacks_inc * m); i++)
{
// std::cout << "i: " << i << ", inc: " << inc_prefix_sum[i] << ", dec: " << dec_prefix_sum[k - i] << "\n";
max = std::max(max, inc_prefix_sum[i] + dec_prefix_sum[k - i]);
}
std::cout << max << '\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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | #include <iostream> #include <vector> #include <algorithm> #include <set> int main() { int n, m, k; std::cin >> n >> m >> k; std::vector<std::vector<long long>> stacks(n, std::vector<long long>(m)); std::vector<bool> increasing(n); // false -- biggest on top for (size_t i = 0; i < n; i++) { for (size_t j = 0; j < m; j++) { std::cin >> stacks[i][j]; if (j > 0 && stacks[i][j] > stacks[i][j - 1]) increasing[i] = true; } } std::vector<long long> dec_sorted; for (size_t i = 0; i < n; i++) { if (!increasing[i]){ dec_sorted.insert(dec_sorted.end(), stacks[i].begin(), stacks[i].end()); } } std::sort(dec_sorted.begin(), dec_sorted.end(), std::greater()); std::vector<long long> dec_prefix_sum(dec_sorted.size() + 1); dec_prefix_sum[0] = 0; for (size_t i = 0; i < dec_sorted.size(); i++) { dec_prefix_sum[i + 1] = dec_prefix_sum[i] + dec_sorted[i]; } // --------- std::vector<std::pair<long long, std::size_t>> inc_stacks_sorted; std::size_t cnt_stacks_inc = 0; for (size_t i = 0; i < n; i++) { if (increasing[i]){ long long sum = 0; cnt_stacks_inc++; for (size_t j = 0; j < m; j++) { sum += stacks[i][j]; } inc_stacks_sorted.push_back({sum, i}); } } std::vector<long long> inc_prefix_sum(cnt_stacks_inc * m + 1); std::sort(inc_stacks_sorted.begin(), inc_stacks_sorted.end(), std::greater()); for (size_t i = 0; i < cnt_stacks_inc; i++) { inc_prefix_sum[(i + 1) * m] = inc_prefix_sum[i * m] + inc_stacks_sorted[i].first; } std::vector<std::vector<long long>> part_sums(cnt_stacks_inc, std::vector<long long>(m)); std::vector<std::set<std::pair<long long, std::size_t>, std::greater<std::pair<long long, std::size_t>>>> part_sums_sorted(m); for (size_t i = 0; i < cnt_stacks_inc; i++) { long long sum = 0; std::size_t ind = inc_stacks_sorted[i].second; for (size_t j = 0; j < m; j++) { sum += stacks[ind][j]; part_sums[i][j] = sum; part_sums_sorted[j].insert({sum, i}); } } int last_deleted = -1; for (size_t i = 0; i < cnt_stacks_inc; i++) { for (size_t j = 0; j < m - 1; j++) { inc_prefix_sum[i * m + j + 1] = inc_prefix_sum[i * m] + part_sums_sorted[j].begin()->first; } if (i + 1 < cnt_stacks_inc && inc_stacks_sorted[i].first != inc_stacks_sorted[i + 1].first) { for (size_t ind = last_deleted + 1; ind <= i; ind++) { for (size_t j = 0; j < m; j++) { part_sums_sorted[j].erase({part_sums[ind][j], ind}); } } last_deleted = i; } } // ----------- // std::cout << "dec prefix sums: "; // for (size_t i = 0; i < dec_prefix_sum.size(); i++) // { // std::cout << dec_prefix_sum[i] << " "; // } // std::cout << "\ninc prefix sums: "; // for (size_t i = 0; i < inc_prefix_sum.size(); i++) // { // std::cout << inc_prefix_sum[i] << " "; // } // std::cout << "\n"; long long max = 0; for (size_t i = k - (dec_prefix_sum.size() - 1); i <= std::min((std::size_t)k, cnt_stacks_inc * m); i++) { // std::cout << "i: " << i << ", inc: " << inc_prefix_sum[i] << ", dec: " << dec_prefix_sum[k - i] << "\n"; max = std::max(max, inc_prefix_sum[i] + dec_prefix_sum[k - i]); } std::cout << max << '\n'; } |
English