#include<iostream>
#include <algorithm>
#include <vector>
#define int long long
using namespace std;
vector<vector<int> > ros;
vector<vector<int> > mal;
int dp[300'007][2];
int zap[300'007];
vector<vector<int>> kol[300'007];
main()
{
//freopen("9867.in","r",stdin);
vector<int> pom;
int n, m, k, odp=0, p;
cin>>n>>m>>k;
for(int a=0; a<n; a++)
{
pom.clear();
for(int i=0; i<m; i++){
cin>>p;
pom.push_back(p);
}
if(m==1 || pom[0]>pom.back())
mal.push_back(pom);
else
ros.push_back(pom);
}
pom.clear();
for(int a=0; a<mal.size(); a++){
for(int i=0; i<mal[a].size(); i++)
pom.push_back(mal[a][i]);
}
sort(pom.begin() , pom.end());
reverse(pom.begin() , pom.end());
for(int i=1; i<=pom.size(); i++)
dp[i][1]=dp[i-1][1]+pom[i-1];
for(int a=0; a<ros.size(); a++){
p=0;
for(int i=0; i<ros[a].size(); i++){
p+=ros[a][i];
kol[i].push_back({p,a});
}
}
for(int a=0; a<m; a++)
sort(kol[a].begin() , kol[a].end());
for(int a=0; a<ros.size(); a++)
{
for(int i=0; i<m; i++)
{
while(zap[kol[i].back()[1]]==1)
kol[i].pop_back();
dp[a*m+i+1][0]=dp[a*m][0]+kol[i].back()[0];
}
zap[kol[m-1].back()[1]]=1;
}
for(int i=0; i<=k ; i++)
odp=max(odp,dp[i][0]+dp[k-i][1]);
cout<<odp;
}
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 | #include<iostream> #include <algorithm> #include <vector> #define int long long using namespace std; vector<vector<int> > ros; vector<vector<int> > mal; int dp[300'007][2]; int zap[300'007]; vector<vector<int>> kol[300'007]; main() { //freopen("9867.in","r",stdin); vector<int> pom; int n, m, k, odp=0, p; cin>>n>>m>>k; for(int a=0; a<n; a++) { pom.clear(); for(int i=0; i<m; i++){ cin>>p; pom.push_back(p); } if(m==1 || pom[0]>pom.back()) mal.push_back(pom); else ros.push_back(pom); } pom.clear(); for(int a=0; a<mal.size(); a++){ for(int i=0; i<mal[a].size(); i++) pom.push_back(mal[a][i]); } sort(pom.begin() , pom.end()); reverse(pom.begin() , pom.end()); for(int i=1; i<=pom.size(); i++) dp[i][1]=dp[i-1][1]+pom[i-1]; for(int a=0; a<ros.size(); a++){ p=0; for(int i=0; i<ros[a].size(); i++){ p+=ros[a][i]; kol[i].push_back({p,a}); } } for(int a=0; a<m; a++) sort(kol[a].begin() , kol[a].end()); for(int a=0; a<ros.size(); a++) { for(int i=0; i<m; i++) { while(zap[kol[i].back()[1]]==1) kol[i].pop_back(); dp[a*m+i+1][0]=dp[a*m][0]+kol[i].back()[0]; } zap[kol[m-1].back()[1]]=1; } for(int i=0; i<=k ; i++) odp=max(odp,dp[i][0]+dp[k-i][1]); cout<<odp; } |
English