#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int n,m,k;
vector<ll> mal(vector<vector<ll>> vec){
vector<ll> ans(k+1,0);
priority_queue<tuple<ll,int,int>> pq; //{wartosc,numer stosu, numer elementu}
for (int i=0;i<vec.size();i++){
pq.push({vec[i][0],i,0});
}
int taken=0;
ll sum=0;
while (!pq.empty() && taken<k){
auto [el,ind,ind2]=pq.top();
pq.pop();
taken++;
sum+=el;
ans[taken]=sum;
if (ind2==m-1) continue;
pq.push({vec[ind][ind2+1],ind,ind2+1});
}
return ans;
}
vector<ll> rosn(vector<vector<ll>> vec){
vector<ll> ans(k+1,0);
for (int i=0;i<vec.size();i++){
for (int j=0;j<m;j++){
if (j>0) vec[i][j]+=vec[i][j-1];
}
}
vector<int> stosy(vec.size());
iota(stosy.begin(),stosy.end(),0);
sort(stosy.begin(),stosy.end(),[&](int a,int b){
return vec[a][m-1]>vec[b][m-1];
});
vector<ll> pref(vec.size());
vector<vector<ll>> maxgora(vec.size()+5,vector<ll>(m+1));
vector<vector<ll>> mindol(vec.size()+1,vector<ll>(m+1,2e18));
for (int i=0;i<vec.size();i++){
pref[i]=vec[stosy[i]][m-1];
if (i>0) pref[i]+=pref[i-1];
}
for (int i=vec.size()-1;i>=0;i--){
for (int j=1;j<m;j++){
maxgora[i][j]=max(maxgora[i+1][j] , vec[stosy[i]][j-1]);
}
}
for (int i=0;i<vec.size();i++){
for (int j=1;j<m;j++){
if (i>0) mindol[i][j]=mindol[i-1][j];
mindol[i][j]=min(mindol[i][j] , vec[stosy[i]][m-1]-vec[stosy[i]][m-1-j]);
}
}
for (int i=0;i<vec.size();i++){
for (int j=0;j<=m;j++){
if (mindol[i][j]==2e18) mindol[i][j]=0;
}
}
for (int i=1;i<=k;i++){
int cale=i/m;
int zostanie=i%m;
if (cale>vec.size()) continue;
if (cale==0){
ans[i]=maxgora[cale][zostanie];
} else {
if (zostanie==0) ans[i]=pref[cale-1];
else ans[i]=max(pref[cale-1]+maxgora[cale][zostanie] , pref[cale]-mindol[cale][m-zostanie]);
}
}
return ans;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>k;
vector<vector<ll>> rosnace;
vector<vector<ll>> malejace;
for (int i=0;i<n;i++){
vector<ll> el;
for (int j=0;j<m;j++){
ll a;
cin>>a;
el.push_back(a);
}
if (el.size()<2 || el[0]>=el[m-1]) malejace.push_back(el);
else rosnace.push_back(el);
}
vector<ll> dp1=mal(malejace);
vector<ll> dp2=rosn(rosnace);
ll ans=0;
for (int i=0;i<=k;i++){
ans=max(ans,dp1[i]+dp2[k-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 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; using ll=long long; int n,m,k; vector<ll> mal(vector<vector<ll>> vec){ vector<ll> ans(k+1,0); priority_queue<tuple<ll,int,int>> pq; //{wartosc,numer stosu, numer elementu} for (int i=0;i<vec.size();i++){ pq.push({vec[i][0],i,0}); } int taken=0; ll sum=0; while (!pq.empty() && taken<k){ auto [el,ind,ind2]=pq.top(); pq.pop(); taken++; sum+=el; ans[taken]=sum; if (ind2==m-1) continue; pq.push({vec[ind][ind2+1],ind,ind2+1}); } return ans; } vector<ll> rosn(vector<vector<ll>> vec){ vector<ll> ans(k+1,0); for (int i=0;i<vec.size();i++){ for (int j=0;j<m;j++){ if (j>0) vec[i][j]+=vec[i][j-1]; } } vector<int> stosy(vec.size()); iota(stosy.begin(),stosy.end(),0); sort(stosy.begin(),stosy.end(),[&](int a,int b){ return vec[a][m-1]>vec[b][m-1]; }); vector<ll> pref(vec.size()); vector<vector<ll>> maxgora(vec.size()+5,vector<ll>(m+1)); vector<vector<ll>> mindol(vec.size()+1,vector<ll>(m+1,2e18)); for (int i=0;i<vec.size();i++){ pref[i]=vec[stosy[i]][m-1]; if (i>0) pref[i]+=pref[i-1]; } for (int i=vec.size()-1;i>=0;i--){ for (int j=1;j<m;j++){ maxgora[i][j]=max(maxgora[i+1][j] , vec[stosy[i]][j-1]); } } for (int i=0;i<vec.size();i++){ for (int j=1;j<m;j++){ if (i>0) mindol[i][j]=mindol[i-1][j]; mindol[i][j]=min(mindol[i][j] , vec[stosy[i]][m-1]-vec[stosy[i]][m-1-j]); } } for (int i=0;i<vec.size();i++){ for (int j=0;j<=m;j++){ if (mindol[i][j]==2e18) mindol[i][j]=0; } } for (int i=1;i<=k;i++){ int cale=i/m; int zostanie=i%m; if (cale>vec.size()) continue; if (cale==0){ ans[i]=maxgora[cale][zostanie]; } else { if (zostanie==0) ans[i]=pref[cale-1]; else ans[i]=max(pref[cale-1]+maxgora[cale][zostanie] , pref[cale]-mindol[cale][m-zostanie]); } } return ans; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>k; vector<vector<ll>> rosnace; vector<vector<ll>> malejace; for (int i=0;i<n;i++){ vector<ll> el; for (int j=0;j<m;j++){ ll a; cin>>a; el.push_back(a); } if (el.size()<2 || el[0]>=el[m-1]) malejace.push_back(el); else rosnace.push_back(el); } vector<ll> dp1=mal(malejace); vector<ll> dp2=rosn(rosnace); ll ans=0; for (int i=0;i<=k;i++){ ans=max(ans,dp1[i]+dp2[k-i]); } cout<<ans<<"\n"; return 0; } |
English