#include "bits/stdc++.h"
using namespace std;
using ll = long long;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
ll n,m,k;
cin>>n >> m >> k;
vector<ll> rest;
ll count = 0;
vector<set<pair<ll,ll>>> S(m);
map<ll, vector<ll>> map;
for (ll i=0;i<n;i++) {
vector<ll> M(m);
vector<ll> N(m);
for (ll j = 0;j<m;j++) {
ll x;
cin >> x;
M[j] = x;
N[j] = j == 0 ? x : N[j-1] + x;
}
if(M[0] >= M[m-1]) {
for (auto x: M) rest.push_back(x);
}
else {
count +=1;
for (ll j = 0; j<m;j++) {
S[j].insert({N[j], i});
}
map[i] = N;
}
}
sort(rest.rbegin(), rest.rend());
for(ll i=1; i<rest.size(); i++) {
rest[i] += rest[i-1];
}
vector<ll> all;
ll prev = 0;
for(ll i=0;i<count;i++) {
for(ll j=0;j<m;j++) {
auto [x, y] = *(--S[j].end());
all.push_back(prev + x);
if (j==m-1) {
for(ll k = 0; k<m; k++) {
S[k].erase({map[y][k], y});
}
prev = all[all.size()-1];
}
}
}
sort(all.begin(), all.end());
if (all.size() == 0) {
cout<<rest[k-1];
return 0;
}
if (rest.size() == 0) {
cout<<all[k-1];
return 0;
}
ll a = k-1;
ll b = -1;
if (a > rest.size()-1){
a = rest.size()-1;
b = k - a-2;
}
ll best = 0;
for(ll i = 0;i<rest.size() + all.size() - k+1;i++){
ll result = b != -1 ? all[b] : 0;
result = a != -1 ? result + rest[a] : result;
best = max(result, best);
a -= 1;
b += 1;
if(a == -2 || b == all.size()) break;
}
cout<<best;
}
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; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll n,m,k; cin>>n >> m >> k; vector<ll> rest; ll count = 0; vector<set<pair<ll,ll>>> S(m); map<ll, vector<ll>> map; for (ll i=0;i<n;i++) { vector<ll> M(m); vector<ll> N(m); for (ll j = 0;j<m;j++) { ll x; cin >> x; M[j] = x; N[j] = j == 0 ? x : N[j-1] + x; } if(M[0] >= M[m-1]) { for (auto x: M) rest.push_back(x); } else { count +=1; for (ll j = 0; j<m;j++) { S[j].insert({N[j], i}); } map[i] = N; } } sort(rest.rbegin(), rest.rend()); for(ll i=1; i<rest.size(); i++) { rest[i] += rest[i-1]; } vector<ll> all; ll prev = 0; for(ll i=0;i<count;i++) { for(ll j=0;j<m;j++) { auto [x, y] = *(--S[j].end()); all.push_back(prev + x); if (j==m-1) { for(ll k = 0; k<m; k++) { S[k].erase({map[y][k], y}); } prev = all[all.size()-1]; } } } sort(all.begin(), all.end()); if (all.size() == 0) { cout<<rest[k-1]; return 0; } if (rest.size() == 0) { cout<<all[k-1]; return 0; } ll a = k-1; ll b = -1; if (a > rest.size()-1){ a = rest.size()-1; b = k - a-2; } ll best = 0; for(ll i = 0;i<rest.size() + all.size() - k+1;i++){ ll result = b != -1 ? all[b] : 0; result = a != -1 ? result + rest[a] : result; best = max(result, best); a -= 1; b += 1; if(a == -2 || b == all.size()) break; } cout<<best; } |
English