// Arti1990, II UWr
#include <bits/stdc++.h>
#define forr(i, n) for(int i=0; i<n; i++)
#define FOREACH(iter, coll) for(auto iter = coll.begin(); iter != coll.end(); ++iter)
#define FOREACHR(iter, coll) for(auto iter = coll.rbegin(); iter != coll.rend(); ++iter)
#define lbound(P,K,FUN) ({auto SSS=P, PPP = P-1, KKK=(K)+1; while(PPP+1!=KKK) {SSS = (PPP+(KKK-PPP)/2); if(FUN(SSS)) KKK = SSS; else PPP = SSS;} PPP;})
#define testy() int _tests; cin>>_tests; FOR(_test, 1, _tests)
#define CLEAR(tab) memset(tab, 0, sizeof(tab))
#define CONTAIN(el, coll) (coll.find(el) != coll.end())
#define FOR(i, a, b) for(int i=a; i<=b; i++)
#define FORD(i, a, b) for(int i=a; i>=b; i--)
#define MP make_pair
#define PB push_back
#define ff first
#define ss second
#define deb(X) X;
#define SIZE(coll) ((int)coll.size())
#define M 1000000007
#define INF 1000000000000000007LL
using namespace std;
long long n, m, k, a;
vector <long long> duze;
long long sumy_duze[1000007], res[1000007], max_suf[1000007];
struct stosy
{
long long suma;
vector <long long> stos, pref;
};
stosy tab[300007];
bool comp(stosy &a, stosy &b)
{
return a.suma > b.suma;
}
int solve()
{
cin >> n >> m >> k;
int ile = 0;
forr(i, n)
{
vector <long long> v;
forr(j, m)
{
cin >> a;
v.PB(a);
}
if(v[0] >= v[m-1])
for(auto el : v)
duze.PB(-el);
else
{
tab[ile].stos = v;
long long s = 0;
forr(j, m)
{
s += v[j];
tab[ile].pref.PB(s);
}
tab[ile].suma = s;
ile++;
}
}
sort(duze.begin(), duze.end());
FOR(i, 1, duze.size())
sumy_duze[i] = sumy_duze[i-1] - duze[i-1];
// FOR(i, 0, k)
// cout << "duze: " << sumy_duze[i] << endl;
sort(tab, tab+ile, comp);
forr(r, m)
{
FORD(i, ile-1, 0)
max_suf[i] = max(max_suf[i+1], tab[i].pref[r]);
// cout << "r - " << r << '\n' << "max_suf: ";
// forr(i, ile)
// cout << max_suf[i] << " ";
// cout << endl;
long long suma = 0, min_suf = INF;
FOR(c, 0, ile-1)
{
//if(c < ile)
min_suf = min(min_suf, tab[c].suma - tab[c].pref[r]);
//else
// min_suf = 0;
// cout << "c: " << c << ", suma: " << suma << ", min_suf: " << min_suf << '\n';
res[c*m+r+1] = max(suma + max_suf[c], suma + tab[c].suma - min_suf);
// cout << "res[" << c*m+r+1 << "] = " << res[c*m+r+1] << '\n';
suma += tab[c].suma;
}
}
long long rr = 0;
FOR(i, 0, k)
rr = max(rr, res[i] + sumy_duze[k-i]);
cout << rr << '\n';
return 0;
}
int main()
{
std::ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
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 | // Arti1990, II UWr #include <bits/stdc++.h> #define forr(i, n) for(int i=0; i<n; i++) #define FOREACH(iter, coll) for(auto iter = coll.begin(); iter != coll.end(); ++iter) #define FOREACHR(iter, coll) for(auto iter = coll.rbegin(); iter != coll.rend(); ++iter) #define lbound(P,K,FUN) ({auto SSS=P, PPP = P-1, KKK=(K)+1; while(PPP+1!=KKK) {SSS = (PPP+(KKK-PPP)/2); if(FUN(SSS)) KKK = SSS; else PPP = SSS;} PPP;}) #define testy() int _tests; cin>>_tests; FOR(_test, 1, _tests) #define CLEAR(tab) memset(tab, 0, sizeof(tab)) #define CONTAIN(el, coll) (coll.find(el) != coll.end()) #define FOR(i, a, b) for(int i=a; i<=b; i++) #define FORD(i, a, b) for(int i=a; i>=b; i--) #define MP make_pair #define PB push_back #define ff first #define ss second #define deb(X) X; #define SIZE(coll) ((int)coll.size()) #define M 1000000007 #define INF 1000000000000000007LL using namespace std; long long n, m, k, a; vector <long long> duze; long long sumy_duze[1000007], res[1000007], max_suf[1000007]; struct stosy { long long suma; vector <long long> stos, pref; }; stosy tab[300007]; bool comp(stosy &a, stosy &b) { return a.suma > b.suma; } int solve() { cin >> n >> m >> k; int ile = 0; forr(i, n) { vector <long long> v; forr(j, m) { cin >> a; v.PB(a); } if(v[0] >= v[m-1]) for(auto el : v) duze.PB(-el); else { tab[ile].stos = v; long long s = 0; forr(j, m) { s += v[j]; tab[ile].pref.PB(s); } tab[ile].suma = s; ile++; } } sort(duze.begin(), duze.end()); FOR(i, 1, duze.size()) sumy_duze[i] = sumy_duze[i-1] - duze[i-1]; // FOR(i, 0, k) // cout << "duze: " << sumy_duze[i] << endl; sort(tab, tab+ile, comp); forr(r, m) { FORD(i, ile-1, 0) max_suf[i] = max(max_suf[i+1], tab[i].pref[r]); // cout << "r - " << r << '\n' << "max_suf: "; // forr(i, ile) // cout << max_suf[i] << " "; // cout << endl; long long suma = 0, min_suf = INF; FOR(c, 0, ile-1) { //if(c < ile) min_suf = min(min_suf, tab[c].suma - tab[c].pref[r]); //else // min_suf = 0; // cout << "c: " << c << ", suma: " << suma << ", min_suf: " << min_suf << '\n'; res[c*m+r+1] = max(suma + max_suf[c], suma + tab[c].suma - min_suf); // cout << "res[" << c*m+r+1 << "] = " << res[c*m+r+1] << '\n'; suma += tab[c].suma; } } long long rr = 0; FOR(i, 0, k) rr = max(rr, res[i] + sumy_duze[k-i]); cout << rr << '\n'; return 0; } int main() { std::ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; } |
English