#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){
cin.tie(0)->sync_with_stdio(0);
int n, m , k;
cin >> n >> m >> k;
vector<vector<ll>> pancakes;
vector<ll> extra;
for(int i = 0; i < n; i++){
vector<ll> tab(m);
bool flag = true;
for(int j = 0; j < m; j++){
cin >> tab[j];
if(j > 0 && tab[j] > tab[j-1]) flag = false;
}
if(flag){
for(ll x : tab) extra.push_back(x);
}else{
for(int j = 1; j < m; j++)
tab[j] += tab[j-1];
pancakes.push_back(tab);
}
}
sort(extra.begin(), extra.end(), [](ll a, ll b){
return a > b;
});
sort(pancakes.begin(), pancakes.end(), [m](vector<ll> &a, vector<ll> &b){
return a[m-1] > b[m-1];
});
int pos = k / m;
int r = k % m;
vector<multiset<ll>> mini(m);
vector<multiset<ll, greater<ll>>> maxi(m);
for(int i = 0; i < m; i++){
mini[i].insert(1e18+7);
maxi[i].insert(0);
}
ll sum = 0;
for(int i = 0; i < pos && i < pancakes.size(); i++){
sum += pancakes[i][m-1];
for(int j = 1; j < m; j++){
mini[j].insert(pancakes[i][m-1] - pancakes[i][j-1]);
}
}
for(int i = pos; i < (int)pancakes.size(); i++){
for(int j = 0; j < m; j++){
maxi[j].insert(pancakes[i][j]);
}
}
ll ans = 0;
ll res = 0;
for(int i = 0;; i++){
if(n*m - extra.size() + i >= k){
// cout << res << " " << k - i << endl;
// cout << pos << endl;
ll tmp = (r == 0 ? 0 : *maxi[r-1].begin());
ans = max(ans, res + sum + tmp);
// cout << sum + tmp << endl;
if(pos >= 0 && pos < (int)pancakes.size()){
tmp = (pos == pancakes.size() ? 0 : pancakes[pos][m-1]);
ans = max(ans, res + sum + tmp - *mini[r].begin());
// cout << sum + tmp - *mini[r].begin() << endl;
}
}
if(i >= (int)extra.size()) break;
if(i >= k) break;
r--;
if(r == -1){
r += m;
pos--;
if(pos >= 0 && pos < (int)pancakes.size())
for(int j = 1; j < m; j++){
mini[j].erase(mini[j].find(pancakes[pos][m-1] - pancakes[pos][j-1]));
}
if(pos >= 0 && pos < (int)pancakes.size()) sum -= pancakes[pos][m-1];
if(pos >= 0 && pos < (int)pancakes.size())
for(int j = 0; j < m; j++){
maxi[j].insert(pancakes[pos][j]);
}
}
res += extra[i];
}
cout << ans << '\n';
return 0;
}
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 | #include <bits/stdc++.h> typedef long long ll; using namespace std; int main(){ cin.tie(0)->sync_with_stdio(0); int n, m , k; cin >> n >> m >> k; vector<vector<ll>> pancakes; vector<ll> extra; for(int i = 0; i < n; i++){ vector<ll> tab(m); bool flag = true; for(int j = 0; j < m; j++){ cin >> tab[j]; if(j > 0 && tab[j] > tab[j-1]) flag = false; } if(flag){ for(ll x : tab) extra.push_back(x); }else{ for(int j = 1; j < m; j++) tab[j] += tab[j-1]; pancakes.push_back(tab); } } sort(extra.begin(), extra.end(), [](ll a, ll b){ return a > b; }); sort(pancakes.begin(), pancakes.end(), [m](vector<ll> &a, vector<ll> &b){ return a[m-1] > b[m-1]; }); int pos = k / m; int r = k % m; vector<multiset<ll>> mini(m); vector<multiset<ll, greater<ll>>> maxi(m); for(int i = 0; i < m; i++){ mini[i].insert(1e18+7); maxi[i].insert(0); } ll sum = 0; for(int i = 0; i < pos && i < pancakes.size(); i++){ sum += pancakes[i][m-1]; for(int j = 1; j < m; j++){ mini[j].insert(pancakes[i][m-1] - pancakes[i][j-1]); } } for(int i = pos; i < (int)pancakes.size(); i++){ for(int j = 0; j < m; j++){ maxi[j].insert(pancakes[i][j]); } } ll ans = 0; ll res = 0; for(int i = 0;; i++){ if(n*m - extra.size() + i >= k){ // cout << res << " " << k - i << endl; // cout << pos << endl; ll tmp = (r == 0 ? 0 : *maxi[r-1].begin()); ans = max(ans, res + sum + tmp); // cout << sum + tmp << endl; if(pos >= 0 && pos < (int)pancakes.size()){ tmp = (pos == pancakes.size() ? 0 : pancakes[pos][m-1]); ans = max(ans, res + sum + tmp - *mini[r].begin()); // cout << sum + tmp - *mini[r].begin() << endl; } } if(i >= (int)extra.size()) break; if(i >= k) break; r--; if(r == -1){ r += m; pos--; if(pos >= 0 && pos < (int)pancakes.size()) for(int j = 1; j < m; j++){ mini[j].erase(mini[j].find(pancakes[pos][m-1] - pancakes[pos][j-1])); } if(pos >= 0 && pos < (int)pancakes.size()) sum -= pancakes[pos][m-1]; if(pos >= 0 && pos < (int)pancakes.size()) for(int j = 0; j < m; j++){ maxi[j].insert(pancakes[pos][j]); } } res += extra[i]; } cout << ans << '\n'; return 0; } |
English