#include <bits/stdc++.h>
using namespace std;
struct wujo
{
vector<long long> p;
long long son;
};
long long e(int f,int si,const vector<long long>& psynu,const vector<wujo>& synu,int m, int mod,const vector<long long>& p1,const vector<long long>& niszowy)
{
long long val=0;
if (si==-1||f<=si) val=psynu[f];
else val=psynu[f+1]-synu[si].son;
int l=mod-f*m;
if (l<0) return -2000000000000000000LL;
return val + p1[min((int)niszowy.size(),l)];
};
long long mlawa(int mod, int si,const vector<long long>& psynu,const vector<wujo>& synu,int m,const vector<long long>&p1,const vector<long long>& niszowy)
{
if (mod<0) return -2000000000000000000LL;
int low=0,high;
if(si==-1)
{
high=synu.size();
}
else
{
high=synu.size()-1;
}
high=min(high,mod/m);
while (high-low>2)
{
int m1=low+(high-low)/3;
int m2=high-(high-low)/3;
if (e(m1,si,psynu,synu,m,mod,p1,niszowy)<e(m2,si,psynu,synu,m,mod,p1,niszowy)) low=m1;
else high=m2;
}
long long best_h=-2000000000000000000LL;
for (int f=low; f<=high; f++)
{
best_h=max(best_h,e(f,si,psynu,synu,m,mod,p1,niszowy));
}
if(best_h<0)
{
return 0;
}
else
{
return best_h;
}
};
int main()
{
cin.tie(0);
ios_base::sync_with_stdio(0);
int n,m,k;
cin>>n>>m>>k;
vector<long long> niszowy;
vector<wujo> synu;
for (int i=0; i<n; i++)
{
vector<long long> a(m);
for (int j=0; j<m; j++)
{
cin>>a[j];
}
if (m==1||a[0]>=a[m-1])
{
for (int j=0; j<m; j++)
{
niszowy.push_back(a[j]);
}
}
else
{
wujo p2;
p2.p.assign(m+1,0);
for (int j=0; j<m; j++)
{
p2.p[j+1]=p2.p[j]+a[j];
}
p2.son = p2.p[m];
synu.push_back(p2);
}
}
sort(niszowy.begin(),niszowy.end(),greater<long long>());
vector<long long> p1(niszowy.size()+1,0);
for (int i=0; i<(int)niszowy.size(); i++)
{
p1[i+1]=p1[i]+niszowy[i];
}
sort(synu.begin(),synu.end(), [](const wujo& a, const wujo& b)
{
return a.son>b.son;
});
vector<long long> psynu(synu.size()+1,0);
for(int i=0; i<(int)synu.size(); i++)
{
psynu[i+1]=psynu[i]+synu[i].son;
}
long long res=0;
res=max(res,mlawa(k,-1,psynu,synu,m,p1,niszowy));
for (int i=0; i<synu.size(); i++)
{
int j=k%m;
if(j>0)
{
long long current=synu[i].p[j]+mlawa(k-j,i,psynu,synu,m,p1,niszowy);
res=max(res,current);
}
}
cout<<res;
}
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 | #include <bits/stdc++.h> using namespace std; struct wujo { vector<long long> p; long long son; }; long long e(int f,int si,const vector<long long>& psynu,const vector<wujo>& synu,int m, int mod,const vector<long long>& p1,const vector<long long>& niszowy) { long long val=0; if (si==-1||f<=si) val=psynu[f]; else val=psynu[f+1]-synu[si].son; int l=mod-f*m; if (l<0) return -2000000000000000000LL; return val + p1[min((int)niszowy.size(),l)]; }; long long mlawa(int mod, int si,const vector<long long>& psynu,const vector<wujo>& synu,int m,const vector<long long>&p1,const vector<long long>& niszowy) { if (mod<0) return -2000000000000000000LL; int low=0,high; if(si==-1) { high=synu.size(); } else { high=synu.size()-1; } high=min(high,mod/m); while (high-low>2) { int m1=low+(high-low)/3; int m2=high-(high-low)/3; if (e(m1,si,psynu,synu,m,mod,p1,niszowy)<e(m2,si,psynu,synu,m,mod,p1,niszowy)) low=m1; else high=m2; } long long best_h=-2000000000000000000LL; for (int f=low; f<=high; f++) { best_h=max(best_h,e(f,si,psynu,synu,m,mod,p1,niszowy)); } if(best_h<0) { return 0; } else { return best_h; } }; int main() { cin.tie(0); ios_base::sync_with_stdio(0); int n,m,k; cin>>n>>m>>k; vector<long long> niszowy; vector<wujo> synu; for (int i=0; i<n; i++) { vector<long long> a(m); for (int j=0; j<m; j++) { cin>>a[j]; } if (m==1||a[0]>=a[m-1]) { for (int j=0; j<m; j++) { niszowy.push_back(a[j]); } } else { wujo p2; p2.p.assign(m+1,0); for (int j=0; j<m; j++) { p2.p[j+1]=p2.p[j]+a[j]; } p2.son = p2.p[m]; synu.push_back(p2); } } sort(niszowy.begin(),niszowy.end(),greater<long long>()); vector<long long> p1(niszowy.size()+1,0); for (int i=0; i<(int)niszowy.size(); i++) { p1[i+1]=p1[i]+niszowy[i]; } sort(synu.begin(),synu.end(), [](const wujo& a, const wujo& b) { return a.son>b.son; }); vector<long long> psynu(synu.size()+1,0); for(int i=0; i<(int)synu.size(); i++) { psynu[i+1]=psynu[i]+synu[i].son; } long long res=0; res=max(res,mlawa(k,-1,psynu,synu,m,p1,niszowy)); for (int i=0; i<synu.size(); i++) { int j=k%m; if(j>0) { long long current=synu[i].p[j]+mlawa(k-j,i,psynu,synu,m,p1,niszowy); res=max(res,current); } } cout<<res; } |
English