#include <algorithm>
#include <cstdio>
#include <functional>
#include <vector>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define VAR(v,w) __typeof(w) v=(w)
#define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it)
#define PB push_back
#define ALL(c) (c).begin(),(c).end()
#define SIZE(c) ((int)(c).size())
#define INT(x) int x; scanf("%d", &x)
#define LLG(x) LL x; scanf("%lld", &x)
typedef long long LL;
typedef vector<LL> VLL;
typedef vector<VLL> VVLL;
VVLL a;
VLL v, sv;
LL s[300000];
LL ss[300000];
int main() {
INT(n);
INT(m);
INT(k);
a.resize(n);
REP(i,n) REP(j,m) {
LLG(aa);
a[i].PB(aa);
}
REP(i,n) {
bool desc = 1;
REP(j,m-1) if (a[i][j] < a[i][j + 1]) {
desc = 0;
break;
}
if (desc) {
s[i] = -1;
REP(j,m) v.PB(a[i][j]);
} else REP(j,m) s[i] += a[i][j];
}
REP(i,n) ss[i] = s[i];
sort(ss, ss + n, greater<LL>());
sort(ALL(v), greater<LL>());
sv.PB(0);
FORE(it,v) sv.PB(sv.back() + *it);
LL res = k <= SIZE(v) ? sv[k] : sv.back();
REP(i,n) {
if (s[i] == -1) continue;
LL x = 0;
REP(jj,m+1) {
if (jj > k) break;
LL sss = 0;
bool skipped = 0;
LL kk = 0;
REP(ii,n+1) {
if (ss[ii] == s[i] && !skipped) {
skipped = 0;
continue;
}
int h = k - jj - kk;
if (h <= SIZE(v)) res = max(res, x + sss + sv[h]);
if (ii == n || ss[ii] == -1) break;
sss += ss[ii];
kk += m;
if (jj + kk > k) break;
}
if (jj < m) x += a[i][jj];
}
}
printf("%lld\n", 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 | #include <algorithm> #include <cstdio> #include <functional> #include <vector> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define VAR(v,w) __typeof(w) v=(w) #define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it) #define PB push_back #define ALL(c) (c).begin(),(c).end() #define SIZE(c) ((int)(c).size()) #define INT(x) int x; scanf("%d", &x) #define LLG(x) LL x; scanf("%lld", &x) typedef long long LL; typedef vector<LL> VLL; typedef vector<VLL> VVLL; VVLL a; VLL v, sv; LL s[300000]; LL ss[300000]; int main() { INT(n); INT(m); INT(k); a.resize(n); REP(i,n) REP(j,m) { LLG(aa); a[i].PB(aa); } REP(i,n) { bool desc = 1; REP(j,m-1) if (a[i][j] < a[i][j + 1]) { desc = 0; break; } if (desc) { s[i] = -1; REP(j,m) v.PB(a[i][j]); } else REP(j,m) s[i] += a[i][j]; } REP(i,n) ss[i] = s[i]; sort(ss, ss + n, greater<LL>()); sort(ALL(v), greater<LL>()); sv.PB(0); FORE(it,v) sv.PB(sv.back() + *it); LL res = k <= SIZE(v) ? sv[k] : sv.back(); REP(i,n) { if (s[i] == -1) continue; LL x = 0; REP(jj,m+1) { if (jj > k) break; LL sss = 0; bool skipped = 0; LL kk = 0; REP(ii,n+1) { if (ss[ii] == s[i] && !skipped) { skipped = 0; continue; } int h = k - jj - kk; if (h <= SIZE(v)) res = max(res, x + sss + sv[h]); if (ii == n || ss[ii] == -1) break; sss += ss[ii]; kk += m; if (jj + kk > k) break; } if (jj < m) x += a[i][jj]; } } printf("%lld\n", res); } |
English