Submission #154923

#TimeUsernameProblemLanguageResultExecution timeMemory
154923srvltSplit the sequence (APIO14_sequence)C++14
100 / 100
1309 ms84700 KiB
//#pragma GCC optimize("Ofast") //#pragma GCC target("sse2,avx") #include <bits/stdc++.h> #define ll long long #define db long double #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define fi first #define se second #define mp make_pair #define endl "\n" using namespace std; void dout() { cerr << endl; } template <typename Head, typename... Tail> void dout(Head H, Tail... T) { cerr << H << ' '; dout(T...); } mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef pair <ll, int> pii; const int N = 1e5 + 3, K = 203; const ll inf = 1e18; int n, k, a[N], p[N], last[K][N]; ll dp[2][N]; struct line { int k = 0; ll b = 0; line(int k, ll b) { this -> k = k; this -> b = b; } ll val(int x) { return (ll)k * x + b; } db intrsc(const line & l) { return (db)(l.b - b) / (db)(k - l.k); } bool del(line & l1, line & l2) { if (k == l1.k) { return b >= l1.b; } return intrsc(l2) < l1.intrsc(l2); } }; vector <line> h; vector <int> ind, ans; vector <ll> pnt; void upd(int x, ll y, int pos) { line tmp = line(x, y); while (h.size() > 1 && tmp.del(h[h.size() - 1], h[h.size() - 2])) { h.ppb(); pnt.ppb(); ind.ppb(); } if (h.size() > 0) { pnt.pb((int)(tmp.intrsc(h.back()))); } h.pb(tmp); ind.pb(pos); } pii getmax(int x) { if (h.empty()) { return {0, 0}; } int tmp = upper_bound(pnt.begin(), pnt.end(), x) - pnt.begin() - 1; return {h[tmp].val(x), ind[tmp]}; } void getans(int x, int y) { if (!y) { return; } ans.pb(y); getans(x - 1, last[x][y]); } void solve(int tc) { cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> a[i]; p[i] = p[i - 1] + a[i]; } for (int i = 1; i <= k; i++) { h = {}, pnt = {-inf}, ind = {}; for (int j = 1; j < i; j++) { dp[i & 1][j] = 0; } for (int j = 1; j < i; j++) { if (i > 1) { upd(p[j], dp[(i - 1) & 1][j], j); } } for (int j = i; j < n; j++) { int x = p[n] - p[j]; pii z = getmax(-x); dp[i & 1][j] = (ll)p[j] * x + z.fi; last[i][j] = z.se; if (i > 1) { upd(p[j], dp[(i - 1) & 1][j], j); } } } int res = -1; for (int i = 1; i < n; i++) { if (res == -1 || dp[k & 1][res] < dp[k & 1][i]) { res = i; } } getans(k, res); cout << dp[k & 1][res] << endl; reverse(ans.begin(), ans.end()); for (auto i : ans) { cout << i << " "; } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); int tc = 1; // cin >> tc; for (int i = 0; i < tc; i++) { solve(i); // cleanup(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...