제출 #562823

#제출 시각아이디문제언어결과실행 시간메모리
562823Ooops_sorry수열 (APIO14_sequence)C++14
71 / 100
774 ms131072 KiB
#include<bits/stdc++.h> using namespace std; #define pb push_back #define ld long double #define ll long long mt19937 rnd(51); const ll INF = 1e18, K = 210; struct line { ll k, b, i; }; vector<line> q[K]; ld intersection(line a, line b) { if (a.k == b.k) cout << "BAD" << endl; return (ld)(b.b - a.b) / (a.k - b.k); } void add(int i, line a) { while (q[i].size() > 1) { int sz = q[i].size(); if (q[i].back().k == a.k) { if (a.b > q[i].back().b) { q[i].pop_back(); } else { return; } } if (intersection(q[i][sz - 2], a) < intersection(q[i][sz - 2], q[i][sz - 1])) { q[i].pop_back(); } else { break; } } if (q[i].size() == 1 && q[i].back().k == a.k) { if (a.b > q[i].back().b) { q[i].pop_back(); } else { return; } } q[i].pb(a); } pair<ll, int> get(int i, ll x) { int l = -1, r = (int)(q[i].size()) - 1; if (q[i].size() == 0) return {-INF, -1}; while (r - l > 1) { int mid = (r + l) / 2; if (intersection(q[i][mid], q[i][mid + 1]) <= x) { l = mid; } else { r = mid; } } return {x * q[i][r].k + q[i][r].b, q[i][r].i}; } signed main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif // LCOAL ios_base::sync_with_stdio(0); cin.tie(0); int n, k; cin >> n >> k; vector<ll> a(n), pr(n); vector<vector<ll>> dp(n + 1, vector<ll>(k + 1, -INF)); vector<vector<int>> par(n + 1, vector<int>(k + 1)); for (int i = 0; i < n; i++) { cin >> a[i]; } reverse(a.begin(), a.end()); for (int i = 0; i < n; i++) { pr[i] = a[i]; if (i > 0) { pr[i] += pr[i - 1]; } } for (int i = 0; i < n; i++) { for (int f = k; f >= 1; f--) { pair<ll, int> p = get(f - 1, pr[i]); dp[i][f] = p.first; par[i][f] = p.second; add(f, {pr[i], dp[i][f] - pr[i] * pr[i], i}); } add(0, {pr[i], 0 - pr[i] * pr[i], i}); } cout << dp[n - 1][k] << endl; vector<int> res; int i = n - 1, j = k, sum = 0; while (j > 0) { res.pb(i - par[i][j]); i = par[i][j]; j--; sum += res.back(); } int now = 0; for (auto to : res) { cout << (now += to) << ' '; } 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...