#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(0);
long long n,m,k;
cin>>n>>m>>k;
vector<vector<long long>>a(n,vector<long long>(m,0));
vector<vector<long long>>pref(n,vector<long long>(m+1,0));
vector<bool>czy(n,false);
vector<long long>rosnace(k+1,0);
vector<long long>malejace(k+1,0);
vector<long long>liczby;
vector<bool>uzyty(n,false);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
pref[i][j+1]=pref[i][j]+a[i][j];
}
bool xd=true;
for(int j=0;j<m-1;j++){
if(a[i][j]<a[i][j+1])
xd=false;
}
if(xd){
czy[i]=true;
for(int j=0;j<m;j++)
liczby.push_back(a[i][j]);
}
}
sort(liczby.begin(),liczby.end(),greater<long long>());
for(int i=1;i<=min(k,(long long)liczby.size());i++){
rosnace[i]=rosnace[i-1]+liczby[i-1];
}
vector<vector<pair<long long,int>>>najlepsze(m);
for(int j=0;j<m;j++){
for(int i=0;i<n;i++){
if(!czy[i])
najlepsze[j].push_back({pref[i][j+1],i});
}
sort(najlepsze[j].begin(),najlepsze[j].end());
}
vector<long long>zuzyte(n);
for(int i=0;i<k;i++){
while(!najlepsze[i%m].empty() && uzyty[najlepsze[i%m].back().second]){
najlepsze[i%m].pop_back();
}
if(!najlepsze[i%m].empty()){
malejace[i]=najlepsze[i%m].back().first+zuzyte[i/m];
if((i+1)%m==0){
uzyty[najlepsze[i%m].back().second]=true;
}
if(i%m==0 && i!=0)
zuzyte[i/m]=malejace[i];
}
}
long long ans=0;
for(int i=0;i<k;i++){
ans=max(ans,rosnace[i]+malejace[k-i-1]);
}
cout<<ans<<'\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 | #include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(0); long long n,m,k; cin>>n>>m>>k; vector<vector<long long>>a(n,vector<long long>(m,0)); vector<vector<long long>>pref(n,vector<long long>(m+1,0)); vector<bool>czy(n,false); vector<long long>rosnace(k+1,0); vector<long long>malejace(k+1,0); vector<long long>liczby; vector<bool>uzyty(n,false); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i][j]; pref[i][j+1]=pref[i][j]+a[i][j]; } bool xd=true; for(int j=0;j<m-1;j++){ if(a[i][j]<a[i][j+1]) xd=false; } if(xd){ czy[i]=true; for(int j=0;j<m;j++) liczby.push_back(a[i][j]); } } sort(liczby.begin(),liczby.end(),greater<long long>()); for(int i=1;i<=min(k,(long long)liczby.size());i++){ rosnace[i]=rosnace[i-1]+liczby[i-1]; } vector<vector<pair<long long,int>>>najlepsze(m); for(int j=0;j<m;j++){ for(int i=0;i<n;i++){ if(!czy[i]) najlepsze[j].push_back({pref[i][j+1],i}); } sort(najlepsze[j].begin(),najlepsze[j].end()); } vector<long long>zuzyte(n); for(int i=0;i<k;i++){ while(!najlepsze[i%m].empty() && uzyty[najlepsze[i%m].back().second]){ najlepsze[i%m].pop_back(); } if(!najlepsze[i%m].empty()){ malejace[i]=najlepsze[i%m].back().first+zuzyte[i/m]; if((i+1)%m==0){ uzyty[najlepsze[i%m].back().second]=true; } if(i%m==0 && i!=0) zuzyte[i/m]=malejace[i]; } } long long ans=0; for(int i=0;i<k;i++){ ans=max(ans,rosnace[i]+malejace[k-i-1]); } cout<<ans<<'\n'; } |
English