#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
bool czyNorm(vector<LL> &a)
{
for (int i=1; i<a.size(); ++i)
if (a[i-1]<a[i])
return true;
return false;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m, k;
cin>>n>>m>>k;
vector<vector<LL>> norm;
vector<LL> odwr;
for (int i=0; i<n; ++i)
{
vector<LL> a(m);
for (int j=0; j<m; ++j)
cin>>a[j];
if (czyNorm(a))
norm.push_back(a);
else
odwr.insert(odwr.end(), a.begin(), a.end());
}
vector<pair<LL, int>> sumy2;
for (int i=0; i<norm.size(); ++i)
{
pair<LL, int> s(0, i);
for (int j=0; j<m; ++j)
s.first+=norm[i][j];
sumy2.push_back(s);
}
sort(sumy2.begin(), sumy2.end());
reverse(sumy2.begin(), sumy2.end());
vector<vector<LL>> n2;
for (int i=0; i<norm.size(); ++i)
n2.push_back(norm[sumy2[i].second]);
norm.swap(n2);
vector<LL> sumyL;
LL ll=0;
for (int i=0; i<norm.size(); ++i)
sumyL.push_back(ll+=sumy2[i].first);
vector<vector<LL>> maPG(norm), miLD(norm);
if (!norm.empty())
{
for (int i=0; i<norm.size(); ++i)
{
for (int j=1; j<m; ++j)
maPG[i][j]+=maPG[i][j-1];
if (1<m)
for (int j=m-2; 0<=j; --j)
miLD[i][j]+=miLD[i][j+1];
}
for (int j=0; j<m; ++j)
{
if (1<norm.size())
for (int i=norm.size()-2; 0<=i; --i)
maPG[i][j]=max(maPG[i][j], maPG[i+1][j]);
for (int i=1; i<norm.size(); ++i)
miLD[i][j]=min(miLD[i][j], miLD[i-1][j]);
}
}
sort(odwr.begin(), odwr.end());
reverse(odwr.begin(), odwr.end());
for (int i=1; i<odwr.size(); ++i)
odwr[i]+=odwr[i-1];
LL wyn=0;
if (k<=odwr.size())
wyn=odwr[k-1];
for (int kn=1, nn=0, mm=-1; kn<=k; ++kn)
{
++mm;
if (m<=mm)
{
++nn;
mm=0;
}
if (norm.size()<=nn)
break;
int ko=k-kn;
if (odwr.size()<ko)
continue;
LL w;
if (mm==m-1)
w=sumyL[nn];
else
{
LL w1=maPG[nn][mm];
if (nn)
w1+=sumyL[nn-1];
LL w2=sumyL[nn]-miLD[nn][mm+1];
w=max(w1, w2);
}
if (ko)
w+=odwr[ko-1];
wyn=max(wyn, w);
}
cout<<wyn<<endl;
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 <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long LL; bool czyNorm(vector<LL> &a) { for (int i=1; i<a.size(); ++i) if (a[i-1]<a[i]) return true; return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m, k; cin>>n>>m>>k; vector<vector<LL>> norm; vector<LL> odwr; for (int i=0; i<n; ++i) { vector<LL> a(m); for (int j=0; j<m; ++j) cin>>a[j]; if (czyNorm(a)) norm.push_back(a); else odwr.insert(odwr.end(), a.begin(), a.end()); } vector<pair<LL, int>> sumy2; for (int i=0; i<norm.size(); ++i) { pair<LL, int> s(0, i); for (int j=0; j<m; ++j) s.first+=norm[i][j]; sumy2.push_back(s); } sort(sumy2.begin(), sumy2.end()); reverse(sumy2.begin(), sumy2.end()); vector<vector<LL>> n2; for (int i=0; i<norm.size(); ++i) n2.push_back(norm[sumy2[i].second]); norm.swap(n2); vector<LL> sumyL; LL ll=0; for (int i=0; i<norm.size(); ++i) sumyL.push_back(ll+=sumy2[i].first); vector<vector<LL>> maPG(norm), miLD(norm); if (!norm.empty()) { for (int i=0; i<norm.size(); ++i) { for (int j=1; j<m; ++j) maPG[i][j]+=maPG[i][j-1]; if (1<m) for (int j=m-2; 0<=j; --j) miLD[i][j]+=miLD[i][j+1]; } for (int j=0; j<m; ++j) { if (1<norm.size()) for (int i=norm.size()-2; 0<=i; --i) maPG[i][j]=max(maPG[i][j], maPG[i+1][j]); for (int i=1; i<norm.size(); ++i) miLD[i][j]=min(miLD[i][j], miLD[i-1][j]); } } sort(odwr.begin(), odwr.end()); reverse(odwr.begin(), odwr.end()); for (int i=1; i<odwr.size(); ++i) odwr[i]+=odwr[i-1]; LL wyn=0; if (k<=odwr.size()) wyn=odwr[k-1]; for (int kn=1, nn=0, mm=-1; kn<=k; ++kn) { ++mm; if (m<=mm) { ++nn; mm=0; } if (norm.size()<=nn) break; int ko=k-kn; if (odwr.size()<ko) continue; LL w; if (mm==m-1) w=sumyL[nn]; else { LL w1=maPG[nn][mm]; if (nn) w1+=sumyL[nn-1]; LL w2=sumyL[nn]-miLD[nn][mm+1]; w=max(w1, w2); } if (ko) w+=odwr[ko-1]; wyn=max(wyn, w); } cout<<wyn<<endl; return 0; } |
English