#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1'000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1'000'000'007LL;
const int N = 1<<19;
vector<ll> sum[N];
vector<ll> ma[N];
ll bst[N];
vector<ll> tab[N];
int cnt[N];
bool Cp(int a, int b)
{
return (sum[a].back() >= sum[b].back());
}
void DoInc(int n, int m)
{
vector<int> p(n + 1, 0);
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j < m; ++j)
sum[i][j] += sum[i][j - 1];
p[i] = i;
}
sort(p.begin() + 1, p.end(), Cp);
for(int l = n; l >= 1; --l)
{
int i = p[l];
ma[i] = sum[i];
if(l != n)
for(int j = 0; j < m; ++j)
ma[i][j] = max(ma[i][j], ma[p[l + 1]][j]);
}
for(int j = 0; j < m; ++j)
{
ll akt = 0LL, m2 = -I;
for(int l = 1; l <= n; ++l)
{
int i = p[l];
bst[(l - 1) * m + j + 1] = max(akt + ma[i][j], akt + m2 + sum[i][m - 1]);
akt += sum[i][m - 1];
m2 = max(m2, sum[i][j] - sum[i][m - 1]);
}
}
}
ll DoDec(int n, int m, int k)
{
ll ans = bst[k];
priority_queue<pair<ll, int>> q;
for(int i = 1; i <= n; ++i)
q.push(pair{tab[i][0], i});
int a; ll cur = 0LL;
for(int i = 1; i <= min(k, n * m); ++i)
{
a = q.top().nd; q.pop();
cur += tab[a][cnt[a]++];
if(cnt[a] < m)
q.push(pair{tab[a][cnt[a]], a});
ans = max(ans, bst[k - i] + cur);
}
return ans;
}
void Solve()
{
int n, m, k;
int ndec = 0, ninc = 0;
cin >> n >> m >> k;
vector<ll> cur(m, 0LL);
for(int i = 1; i <= n; ++i)
{
for(int j = 0; j < m; ++j)
cin >> cur[j];
if(cur[0] > cur[m - 1])
tab[++ndec] = cur;
else
sum[++ninc] = cur;
}
DoInc(ninc, m);
for(int i = 1; i <= k; ++i)
bst[i] = max(bst[i], bst[i - 1]);
ll ans = 0LL;
ans = DoDec(ndec, m, k);
cout << ans << "\n";
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
//int t; cin >> t;
//while(t--)
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 | #include <bits/stdc++.h> using namespace std; #define pb push_back #define st first #define nd second typedef long long ll; typedef long double ld; const ll I = 1'000'000'000'000'000'000LL; const int II = 2'000'000'000; const ll M = 1'000'000'007LL; const int N = 1<<19; vector<ll> sum[N]; vector<ll> ma[N]; ll bst[N]; vector<ll> tab[N]; int cnt[N]; bool Cp(int a, int b) { return (sum[a].back() >= sum[b].back()); } void DoInc(int n, int m) { vector<int> p(n + 1, 0); for(int i = 1; i <= n; ++i) { for(int j = 1; j < m; ++j) sum[i][j] += sum[i][j - 1]; p[i] = i; } sort(p.begin() + 1, p.end(), Cp); for(int l = n; l >= 1; --l) { int i = p[l]; ma[i] = sum[i]; if(l != n) for(int j = 0; j < m; ++j) ma[i][j] = max(ma[i][j], ma[p[l + 1]][j]); } for(int j = 0; j < m; ++j) { ll akt = 0LL, m2 = -I; for(int l = 1; l <= n; ++l) { int i = p[l]; bst[(l - 1) * m + j + 1] = max(akt + ma[i][j], akt + m2 + sum[i][m - 1]); akt += sum[i][m - 1]; m2 = max(m2, sum[i][j] - sum[i][m - 1]); } } } ll DoDec(int n, int m, int k) { ll ans = bst[k]; priority_queue<pair<ll, int>> q; for(int i = 1; i <= n; ++i) q.push(pair{tab[i][0], i}); int a; ll cur = 0LL; for(int i = 1; i <= min(k, n * m); ++i) { a = q.top().nd; q.pop(); cur += tab[a][cnt[a]++]; if(cnt[a] < m) q.push(pair{tab[a][cnt[a]], a}); ans = max(ans, bst[k - i] + cur); } return ans; } void Solve() { int n, m, k; int ndec = 0, ninc = 0; cin >> n >> m >> k; vector<ll> cur(m, 0LL); for(int i = 1; i <= n; ++i) { for(int j = 0; j < m; ++j) cin >> cur[j]; if(cur[0] > cur[m - 1]) tab[++ndec] = cur; else sum[++ninc] = cur; } DoInc(ninc, m); for(int i = 1; i <= k; ++i) bst[i] = max(bst[i], bst[i - 1]); ll ans = 0LL; ans = DoDec(ndec, m, k); cout << ans << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); //int t; cin >> t; //while(t--) Solve(); return 0; } |
English