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
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
struct S{ll s;vector<ll>p;};
int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	int n,m,k;cin>>n>>m>>k;
	vector<S>ic;vector<ll>g;
	for(int i=0;i<n;++i){
		vector<ll>v(m);for(ll&x:v)cin>>x;
		if(v[0]<=v[m-1]){
			vector<ll>p(m+1,0);for(int j=0;j<m;++j)p[j+1]=p[j]+v[j];
			ic.push_back({p[m],p});
		}else for(ll x:v)g.push_back(x);
	}
	sort(g.begin(),g.end(),greater<ll>());
	int gs=g.size();vector<ll>pg(gs+1,0);
	for(int i=0;i<gs;++i)pg[i+1]=pg[i]+g[i];
	sort(ic.begin(),ic.end(),[](auto&a,auto&b){return a.s>b.s;});
	int ni=ic.size();vector<ll>pb(ni+1,0);
	for(int i=0;i<ni;++i)pb[i+1]=pb[i]+ic[i].s;
	ll ans=0;
	for(int b=0;b<=ni;++b){
		ll r=k-1LL*b*m;
		if(r>=0&&r<=gs)ans=max(ans,pb[b]+pg[r]);
	}
	for(int x=1;x<m;++x){
		ll K=k-x;if(K<0)continue;
		vector<ll>M1(ni,-1e18),M2(ni,-1e18);
		for(int b=0;b<ni;++b){
			ll r=K-1LL*b*m;
			if(r>=0&&r<=gs){M1[b]=pb[b]+pg[r];M2[b]=pb[b+1]+pg[r];}
		}
		vector<ll>pr(ni),sf(ni);ll c=-1e18;
		for(int b=0;b<ni;++b){c=max(c,M1[b]);pr[b]=c;}
		c=-1e18;for(int b=ni-1;b>=0;--b){c=max(c,M2[b]);sf[b]=c;}
		for(int r=0;r<ni;++r){
			ll bo=pr[r];if(r+1<ni)bo=max(bo,sf[r+1]-ic[r].s);
			ans=max(ans,ic[r].p[x]+bo);
		}
	}
	cout<<ans<<'\n';
}