Submission #154916

#TimeUsernameProblemLanguageResultExecution timeMemory
154916srvltSplit the sequence (APIO14_sequence)C++14
0 / 100
101 ms9468 KiB
//#pragma GCC optimize("Ofast") //#pragma GCC target("sse2,avx") #include <bits/stdc++.h> #define ll int #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" #define int int 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 <int, int> pii; const int N = 1e5 + 3, K = 203, inf = 2e9; int n, k, a[N], dp[2][N], p[N]; ll last[K][N]; struct line { int k = 0, b = 0; line(int k, int b) { this -> k = k; this -> b = b; } int val(int x) { return 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, pnt; void upd(int x, int 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] = 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...