Submission #329236

#TimeUsernameProblemLanguageResultExecution timeMemory
329236jovan_bSplit the sequence (APIO14_sequence)C++17
71 / 100
2080 ms25568 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll pre[100005]; ll a[100005]; ll dp[100005]; ll dpp[100005]; int prosli[205][100005]; struct line{ ll a, b; int ind; int level; ll eval(ll x){ return a*x+b; } }; line seg[400005]; void upd(int node, int l, int r, line g){ int mid = (l+r)/2; if((g.eval(pre[l]) >= seg[node].eval(pre[l]) && g.eval(pre[r]) >= seg[node].eval(pre[r])) || seg[node].level != g.level){ seg[node] = g; return; } if(l == r) return; if(g.eval(pre[l]) > seg[node].eval(pre[l]) || g.eval(pre[mid]) > seg[node].eval(pre[mid])) upd(node*2, l, mid, g); if(g.eval(pre[r]) > seg[node].eval(pre[r]) || g.eval(pre[mid+1]) > seg[node].eval(pre[mid+1])) upd(node*2+1, mid+1, r, g); } pair <int, ll> query(int node, int l, int r, int x, int lvl){ pair <int, ll> res1 = {seg[node].ind, seg[node].eval(pre[x])}; if(lvl != seg[node].level) return {0, 0}; if(l == r) return res1; int mid = (l+r)/2; pair <int, ll> res2; if(x <= mid) res2 = query(node*2, l, mid, x, lvl); else res2 = query(node*2+1, mid+1, r, x, lvl); if(res1.second >= res2.second) return res1; else return res2; } void init(int node, int l, int r){ if(l == r){ seg[node].a = -100000; seg[node].b = -1000000000000000LL; seg[node].ind = 0; seg[node].level = 0; return; } int mid = (l+r)/2; init(node*2, l, mid); init(node*2+1, mid+1, r); } int main(){ ios_base::sync_with_stdio(false), cin.tie(0); int n, k; cin >> n >> k; for(int i=1; i<=n; i++){ cin >> a[i]; pre[i] = pre[i-1] + a[i]; } init(1, 1, n); for(int j=1; j<=k; j++){ for(int i=1; i<=n; i++){ pair <int, ll> d = query(1, 1, n, i, j); dp[i] = d.second; prosli[j][i] = d.first; line nline; nline.a = pre[i]; nline.b = -pre[i]*pre[i] + dpp[i]; nline.ind = i; nline.level = j; upd(1, 1, n, nline); } for(int i=1; i<=n; i++){ dpp[i] = dp[i]; } } cout << dp[n] << "\n"; int t = n; for(int i=k; i>=1; i--){ cout << prosli[i][t] << " "; t = prosli[i][t]; } return 0; } /* 7 3 4 1 3 4 0 2 3 */
#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...