Submission #130143

#TimeUsernameProblemLanguageResultExecution timeMemory
130143mlyean00Split the sequence (APIO14_sequence)C++14
0 / 100
1587 ms23984 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; struct line { int idx; ll a, b; line(int idx, ll a, ll b) : idx(idx), a(a), b(b) {} ll cost(ll x) const { return a * (x - a) + b; } ll intersect(line const& other) { ll lo = other.a; ll hi = 1LL << 48; while (lo < hi) { ll mid = (lo + hi) / 2; if (cost(mid) > other.cost(mid)) { lo = mid + 1; } else { hi = mid; } } return lo; } }; int main() { int n, k; cin >> n >> k; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } vector<ll> pref(n + 1, 0); partial_sum(a.begin(), a.end(), pref.begin() + 1); ll dp[k + 1][n + 1]; int parent[k + 1][n + 1]; for (int i = 0; i <= k; ++i) { for (int j = 0; j <= n; ++j) { dp[i][j] = 0; } } for (int i = 1; i <= k; ++i) { deque<line> dq; for (int j = 0; j <= n; ++j) { while (dq.size() > 1 && dq[0].cost(pref[j]) <= dq[1].cost(pref[j])) { dq.pop_front(); } if (!dq.empty()) { dp[i][j] = dq[0].cost(pref[j]); parent[i][j] = dq[0].idx; } line l(j, pref[j], dp[i - 1][j]); while (dq.size() > 1) { int sz = dq.size(); ll t1 = dq[sz - 2].intersect(dq[sz - 1]); ll t2 = dq[sz - 1].intersect(l); if (t1 < t2) break; dq.pop_back(); } dq.push_back(l); } } cout << dp[k][n] << endl; int u = n; for (int i = k; i > 0; --i) { u = parent[i][u]; cout << u << ' '; } cout << endl; return 0; }
#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...