#include<bits/stdc++.h>
using namespace std;
using ll = long long;
bool czy_niemalejacy(const vector<long long>& v) {
if (v.size() < 2) return true;
for (size_t i = 1; i < v.size(); ++i) {
if (v[i-1] > v[i]) {
return false;
}
}
return true;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m, k;
cin >> n >> m >> k;
vector<pair<pair<ll,int>,vector<ll>>>V;
vector<vector<ll>>U;
for(int i = 0; i < n; i++){
vector<ll>a(m);
for(auto &x : a)cin >> x;
ll sum = 0;
for(auto x : a)sum += x;
if(czy_niemalejacy(a))V.push_back({{sum,-i},a});
else U.push_back(a);
}
priority_queue<pair<ll,int>>pq;
for(auto &x : U)reverse(x.begin(),x.end());
vector<ll>wynU(n * m + 99);
for(int i = 0; i < (int)U.size(); i++)pq.push({U[i].back(),i});
ll w = 0;
int i__ = 0;
while(!pq.empty()){
if(pq.empty())break;
auto[x,i] = pq.top();
pq.pop();
w += x;
wynU[1+i__++] = w;
U[i].pop_back();
if(!U[i].empty()){
pq.push({U[i].back(),i});
}
}
ll maks = 0;
for(int kkk = 0; kkk < 2; kkk++){
for(auto &x : V){
x.first.second *= -1;
}
sort(V.begin(),V.end());
vector<ll>MAKS(m);
vector<ll>wyn(n * m + 99);
ll sum = 0;
for(auto x : V){
for(auto y : x.second)sum += y;
}
int ile = V.size() * m;
for(int ii = 0; ii < (int)V.size(); ii++){
auto [p1,v] = V[ii];
auto[ss,xdddd] = p1;
ile -= m;
sum -= ss;
wyn[ile] = max(wyn[ile],sum);
ll akt_sum = 0;
for(int i = 0; i < m; i++){
akt_sum += v[i];
MAKS[i] = max(MAKS[i],akt_sum);
}
for(int i = 0; i < m; i++){
wyn[ile+i+1] = max(wyn[ile+i+1],sum + MAKS[i]);
}
}
for(int i = 0; i <= k; i++){
// cout << wyn[i] << " + " << wynU[k-i] << endl;
maks = max(maks, wyn[i] + wynU[k-i]);
}
}
cout << maks << '\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 | #include<bits/stdc++.h> using namespace std; using ll = long long; bool czy_niemalejacy(const vector<long long>& v) { if (v.size() < 2) return true; for (size_t i = 1; i < v.size(); ++i) { if (v[i-1] > v[i]) { return false; } } return true; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, m, k; cin >> n >> m >> k; vector<pair<pair<ll,int>,vector<ll>>>V; vector<vector<ll>>U; for(int i = 0; i < n; i++){ vector<ll>a(m); for(auto &x : a)cin >> x; ll sum = 0; for(auto x : a)sum += x; if(czy_niemalejacy(a))V.push_back({{sum,-i},a}); else U.push_back(a); } priority_queue<pair<ll,int>>pq; for(auto &x : U)reverse(x.begin(),x.end()); vector<ll>wynU(n * m + 99); for(int i = 0; i < (int)U.size(); i++)pq.push({U[i].back(),i}); ll w = 0; int i__ = 0; while(!pq.empty()){ if(pq.empty())break; auto[x,i] = pq.top(); pq.pop(); w += x; wynU[1+i__++] = w; U[i].pop_back(); if(!U[i].empty()){ pq.push({U[i].back(),i}); } } ll maks = 0; for(int kkk = 0; kkk < 2; kkk++){ for(auto &x : V){ x.first.second *= -1; } sort(V.begin(),V.end()); vector<ll>MAKS(m); vector<ll>wyn(n * m + 99); ll sum = 0; for(auto x : V){ for(auto y : x.second)sum += y; } int ile = V.size() * m; for(int ii = 0; ii < (int)V.size(); ii++){ auto [p1,v] = V[ii]; auto[ss,xdddd] = p1; ile -= m; sum -= ss; wyn[ile] = max(wyn[ile],sum); ll akt_sum = 0; for(int i = 0; i < m; i++){ akt_sum += v[i]; MAKS[i] = max(MAKS[i],akt_sum); } for(int i = 0; i < m; i++){ wyn[ile+i+1] = max(wyn[ile+i+1],sum + MAKS[i]); } } for(int i = 0; i <= k; i++){ // cout << wyn[i] << " + " << wynU[k-i] << endl; maks = max(maks, wyn[i] + wynU[k-i]); } } cout << maks << '\n'; } |
English