#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX = 300003;
ll pref_v[MAX];
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, m, k;
cin >> n >> m >> k;
ll x;
vector <ll> V;
vector<pair<ll, vector<ll>>> rosnace;
for (int i=1; i<=n; i++){
vector<ll> akt;
for (int j=1; j<=m; j++){
cin >> x;
akt.push_back(x);
}
if (m == 1){
V.push_back(x);
}
else{
if (akt[0]-akt[1] >= 0){
for (ll j : akt) V.push_back(j);
}
else{
ll s=0;
vector <ll> p(m+1, 0);
for (int j=0; j<m; j++){
s += akt[j];
p[j+1] = s;
}
rosnace.push_back({s, p});
}
}
}
sort(V.rbegin(), V.rend());
for (int i=0; i<V.size(); i++){
pref_v[i+1] = pref_v[i] + V[i];
}
sort(rosnace.rbegin(), rosnace.rend());
int ra = (int)V.size();
int rb = (int)rosnace.size();
vector <ll> pref_r(rb+1, 0);
for (int i=0; i<rb; i++) pref_r[i+1] = pref_r[i] + rosnace[i].first;
ll wyn=0;
for (int i=0; i<=rb; i++){
ll wziete = (ll)i*m;
if (wziete <= k){
int ile = k-wziete;
if (ile <= ra) wyn = max(wyn, pref_r[i] + pref_v[ile]);
}
}
vector <ll> V1(rb+1);
vector <ll> V2(rb+1);
vector <ll> pref_maks1(rb+1);
vector <ll> pref_maks2(rb+1);
if (rb > 0 && m > 1){
for (int i=1; i<m; i++){
int R = k-i;
if (R<0) continue;
int cale = min(rb-1, R/m);
if (cale < 0) continue;
for (int j=0; j<=cale; j++){
int pozostaleV = R - j*m;
if (pozostaleV <= ra && pozostaleV >= 0){
V1[j] = pref_r[j] + pref_v[pozostaleV];
if (j+1 <= rb) V2[j] = pref_r[j+1] + pref_v[pozostaleV];
else V2[j] = -1e18;
}
else{
V1[j] = -1e18;
V2[j] = -1e18;
}
}
pref_maks1[0] = V1[0];
for (int j=1; j<=cale; j++) pref_maks1[j] = max(pref_maks1[j-1], V1[j]);
pref_maks2[cale] = V2[cale];
for (int j=cale-1; j>=0; j--) pref_maks2[j] = max(pref_maks2[j+1], V2[j]);
for (int j=0; j<rb; j++){
ll op1 = pref_maks1[min(j, cale)];
ll op2 = -1e18;
if (j+1 <= cale){
op2 = pref_maks2[j+1];
if (op2 != -1e18) op2 -= rosnace[j].first;
}
if (max(op1, op2) != -1e18) wyn = max(wyn, max(op1, op2) + rosnace[j].second[i]);
}
}
}
cout << wyn << "\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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX = 300003; ll pref_v[MAX]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, k; cin >> n >> m >> k; ll x; vector <ll> V; vector<pair<ll, vector<ll>>> rosnace; for (int i=1; i<=n; i++){ vector<ll> akt; for (int j=1; j<=m; j++){ cin >> x; akt.push_back(x); } if (m == 1){ V.push_back(x); } else{ if (akt[0]-akt[1] >= 0){ for (ll j : akt) V.push_back(j); } else{ ll s=0; vector <ll> p(m+1, 0); for (int j=0; j<m; j++){ s += akt[j]; p[j+1] = s; } rosnace.push_back({s, p}); } } } sort(V.rbegin(), V.rend()); for (int i=0; i<V.size(); i++){ pref_v[i+1] = pref_v[i] + V[i]; } sort(rosnace.rbegin(), rosnace.rend()); int ra = (int)V.size(); int rb = (int)rosnace.size(); vector <ll> pref_r(rb+1, 0); for (int i=0; i<rb; i++) pref_r[i+1] = pref_r[i] + rosnace[i].first; ll wyn=0; for (int i=0; i<=rb; i++){ ll wziete = (ll)i*m; if (wziete <= k){ int ile = k-wziete; if (ile <= ra) wyn = max(wyn, pref_r[i] + pref_v[ile]); } } vector <ll> V1(rb+1); vector <ll> V2(rb+1); vector <ll> pref_maks1(rb+1); vector <ll> pref_maks2(rb+1); if (rb > 0 && m > 1){ for (int i=1; i<m; i++){ int R = k-i; if (R<0) continue; int cale = min(rb-1, R/m); if (cale < 0) continue; for (int j=0; j<=cale; j++){ int pozostaleV = R - j*m; if (pozostaleV <= ra && pozostaleV >= 0){ V1[j] = pref_r[j] + pref_v[pozostaleV]; if (j+1 <= rb) V2[j] = pref_r[j+1] + pref_v[pozostaleV]; else V2[j] = -1e18; } else{ V1[j] = -1e18; V2[j] = -1e18; } } pref_maks1[0] = V1[0]; for (int j=1; j<=cale; j++) pref_maks1[j] = max(pref_maks1[j-1], V1[j]); pref_maks2[cale] = V2[cale]; for (int j=cale-1; j>=0; j--) pref_maks2[j] = max(pref_maks2[j+1], V2[j]); for (int j=0; j<rb; j++){ ll op1 = pref_maks1[min(j, cale)]; ll op2 = -1e18; if (j+1 <= cale){ op2 = pref_maks2[j+1]; if (op2 != -1e18) op2 -= rosnace[j].first; } if (max(op1, op2) != -1e18) wyn = max(wyn, max(op1, op2) + rosnace[j].second[i]); } } } cout << wyn << "\n"; return 0; } |
English