Submission #748449

#TimeUsernameProblemLanguageResultExecution timeMemory
748449Desh03Split the sequence (APIO14_sequence)C++17
100 / 100
724 ms91688 KiB
#include <bits/stdc++.h> using namespace std; struct line { long long m, c; int id; long long value(int x) { return m * x + c; } long double isec(const line &l) { return (c - l.c) / (long double) (l.m - m); } }; struct CHT { deque<line> cht; void insert(line l) { if (cht.empty()) { cht.push_back(l); return; } if (cht.back().m == l.m) { cht.back() = l; return; } while (cht.size() >= 2 && cht.back().isec(*next(cht.rbegin())) >= (cht.back()).isec(l)) cht.pop_back(); cht.push_back(l); } pair<long long, int> query(int x) { while (cht.size() >= 2 && cht[0].value(x) <= cht[1].value(x)) cht.pop_front(); return {cht[0].value(x), cht[0].id}; } } cht[201]; int pre[100001], par[201][100001]; signed main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, k; long long ans; cin >> n >> k; for (int i = 1; i <= n; i++) cin >> pre[i], pre[i] += pre[i - 1]; for (int i = 1; i <= n; i++) { long long prev = 0; for (int j = 1; j <= min(k, i - 1); j++) { auto [x, y] = cht[j].query(pre[i]); if (i == n && j == k) ans = x; par[j][i] = y; cht[j].insert({pre[i], prev - (long long) pre[i] * pre[i], i}); prev = x; } if (k >= i) cht[i].insert({pre[i], prev - (long long) pre[i] * pre[i], i}); } cout << ans << '\n'; for (int x = par[k][n], i = k; i >= 1; i--, x = par[i][x]) cout << x << ' '; }
#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...