#include <bits/stdc++.h>
#define pii pair<int, int>
#define For(i, l, r) for (int i=l;(l<=r?i<=r:i>=r);(l<=r?i++:i--))
//#define DEBUG
#ifdef DEBUG
auto operator<<(auto &o,auto p)->decltype(p.first,o){return o<<'('<<p.first<<", "<<p.second<<')';}
auto operator<<(auto &o,auto x)->decltype(x.end(),o){o<<'{';int i=2;for(auto &e:x)o<<(", ")+i<<e,i=0;return o<<'}';}
#define LOG(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X);
#else
#define LOG(x...)(void)0
#endif
#define int long long
using namespace std;
const int inf=1LL << 61;
void solve(){
int n, m, k, s;
cin >> n >> m >> k;
s = n * m;
vector<int> a;
a.push_back(inf);
vector<vector<int>> stacks(n, vector<int>(m));
for (int i = 0; i < n; i++){
bool reversed = false;
for (int j = 0; j < m; j++){
cin >> stacks[i][j];
if (j > 0 && stacks[i][j] < stacks[i][j - 1])
reversed = true;
}
if (reversed){
for (auto el: stacks[i])
a.push_back(el);
i--;
n--;
}
}
stacks.resize(n);
sort(a.begin(), a.end(), [](int a, int b){return a > b;});
vector<pii> sums(n);
vector<vector<int>> inpref(n, vector<int>(m + 1));
for (int i = 0; i < n; i++){
for (int j = 0; j < m; ++j)
inpref[i][j + 1] = inpref[i][j] + stacks[i][j];
sums[i] = {inpref[i][m], i};
}
sort(sums.begin(), sums.end(), [](pii a, pii b){
if (a.first != b.first)
return a.first > b.first;
return a.second < b.second;
});
vector<int> pos(n), outpref(n + 1);
for (int i = 0; i < n; ++i){
pos[sums[i].second] = i;
outpref[i + 1] = outpref[i] + sums[i].first;
}
a.push_back(0);
auto bin_search = [&](int x){
int f = 0, l = a.size() - 1;
while (f < l){
int m = (f + l + 1) / 2;
if (a[m] < x)
l = m - 1;
else
f = m;
}
return f;
};
vector<vector<pii>> pot_pl(a.size());
for (int i = 0; i < n; ++i){
for (int j = 0; j < m; ++j){
int f = bin_search(stacks[i][j]);
if (stacks[i][j] > a[f] || (f + 1 < a.size() && (stacks[i][j] <= a[f + 1] || (j + 1 < m && stacks[i][j + 1] <= a[f + 1]))))
continue;
if ((k - f) % m == j + 1){
pot_pl[f].push_back({i, j});
}
}
}
int a_sum = -a[0], res = 0;
for (int i = 0; i < a.size() - 1 && i <= k; ++i){
a_sum += a[i];
if ((k - i) > n * m){
continue;
}
if ((k - i) % m == 0){
res = max(res, a_sum + outpref[(k - i) / m]);
continue;
}
for (auto [id, j]: pot_pl[i]){
int cur_res = a_sum + inpref[id][j + 1] + outpref[(k - i) / m];
if (pos[id] < (k - i) / m)
cur_res += (sums[(k - i) / m].first - inpref[id][m]);
res = max(res, cur_res);
}
}
cout << res << '\n';
}
signed main(){
cin.tie(0)->sync_with_stdio(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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #include <bits/stdc++.h> #define pii pair<int, int> #define For(i, l, r) for (int i=l;(l<=r?i<=r:i>=r);(l<=r?i++:i--)) //#define DEBUG #ifdef DEBUG auto operator<<(auto &o,auto p)->decltype(p.first,o){return o<<'('<<p.first<<", "<<p.second<<')';} auto operator<<(auto &o,auto x)->decltype(x.end(),o){o<<'{';int i=2;for(auto &e:x)o<<(", ")+i<<e,i=0;return o<<'}';} #define LOG(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X); #else #define LOG(x...)(void)0 #endif #define int long long using namespace std; const int inf=1LL << 61; void solve(){ int n, m, k, s; cin >> n >> m >> k; s = n * m; vector<int> a; a.push_back(inf); vector<vector<int>> stacks(n, vector<int>(m)); for (int i = 0; i < n; i++){ bool reversed = false; for (int j = 0; j < m; j++){ cin >> stacks[i][j]; if (j > 0 && stacks[i][j] < stacks[i][j - 1]) reversed = true; } if (reversed){ for (auto el: stacks[i]) a.push_back(el); i--; n--; } } stacks.resize(n); sort(a.begin(), a.end(), [](int a, int b){return a > b;}); vector<pii> sums(n); vector<vector<int>> inpref(n, vector<int>(m + 1)); for (int i = 0; i < n; i++){ for (int j = 0; j < m; ++j) inpref[i][j + 1] = inpref[i][j] + stacks[i][j]; sums[i] = {inpref[i][m], i}; } sort(sums.begin(), sums.end(), [](pii a, pii b){ if (a.first != b.first) return a.first > b.first; return a.second < b.second; }); vector<int> pos(n), outpref(n + 1); for (int i = 0; i < n; ++i){ pos[sums[i].second] = i; outpref[i + 1] = outpref[i] + sums[i].first; } a.push_back(0); auto bin_search = [&](int x){ int f = 0, l = a.size() - 1; while (f < l){ int m = (f + l + 1) / 2; if (a[m] < x) l = m - 1; else f = m; } return f; }; vector<vector<pii>> pot_pl(a.size()); for (int i = 0; i < n; ++i){ for (int j = 0; j < m; ++j){ int f = bin_search(stacks[i][j]); if (stacks[i][j] > a[f] || (f + 1 < a.size() && (stacks[i][j] <= a[f + 1] || (j + 1 < m && stacks[i][j + 1] <= a[f + 1])))) continue; if ((k - f) % m == j + 1){ pot_pl[f].push_back({i, j}); } } } int a_sum = -a[0], res = 0; for (int i = 0; i < a.size() - 1 && i <= k; ++i){ a_sum += a[i]; if ((k - i) > n * m){ continue; } if ((k - i) % m == 0){ res = max(res, a_sum + outpref[(k - i) / m]); continue; } for (auto [id, j]: pot_pl[i]){ int cur_res = a_sum + inpref[id][j + 1] + outpref[(k - i) / m]; if (pos[id] < (k - i) / m) cur_res += (sums[(k - i) / m].first - inpref[id][m]); res = max(res, cur_res); } } cout << res << '\n'; } signed main(){ cin.tie(0)->sync_with_stdio(0); int t=1; //cin >> t; while(t--) solve(); } |
English