Submission #1211159

#TimeUsernameProblemLanguageResultExecution timeMemory
1211159k1r1t0수열 (APIO14_sequence)C++20
100 / 100
496 ms81952 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 110000; const int K = 210; struct pt {ll x, y;}; pt operator +(pt a, pt b) {return {a.x + b.x, a.y + b.y};} pt operator -(pt a, pt b) {return {a.x - b.x, a.y - b.y};} ll cross(pt a, pt b) {return a.x * b.y - a.y * b.x;} ll cross(pt a, pt b, pt c) {return cross(b - a, c - b);} ll get(pt a, ll x) {return a.x * x + a.y;} int n, k, p[K][N]; ll a[N], dp[N]; deque<pair<pt, int>> cht; void init() { cht.clear(); } void upd(ll k, ll b, int t) { pt cur = {k, b}; while (cht.size() > 1 && cross(end(cht)[-2].first, cht.back().first, cur) >= 0) cht.pop_back(); cht.push_back({cur, t}); } pair<ll, int> get(ll x) { assert(!cht.empty()); while (cht.size() > 1 && get(cht[0].first, x) <= get(cht[1].first, x)) cht.pop_front(); return {get(cht[0].first, x), cht[0].second}; } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k; k++; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) a[i] += a[i - 1]; for (int t = 2; t <= k; t++) { init(); for (int i = t - 1; i <= n; i++) { ll old = dp[i]; if (i >= t) tie(dp[i], p[t][i]) = get(a[i]); upd(a[i], old - a[i] * a[i], i); } } vector<int> ans; int t = n; do { t = p[k][t]; k--; ans.push_back(t); } while (t != 0); ans.pop_back(); reverse(begin(ans), end(ans)); cout << dp[n] << '\n'; for (int x : ans) 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...