제출 #1229130

#제출 시각아이디문제언어결과실행 시간메모리
122913012345678수열 (APIO14_sequence)C++17
0 / 100
0 ms324 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int nx=1e5+5, kx=205; ll n, k, dp[2][nx], qs[nx]; int back[kx][nx]; struct line { ll m, c; int idx; line(ll m, ll c, int idx): m(m), c(c), idx(idx){} ll val(ll x) {return m*x+c;} }; deque<line> dq; int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>k; for (int i=1; i<=n; i++) cin>>qs[i], qs[i]+=qs[i-1]; for (int l=1; l<=k; l++) { dq.clear(); int cur=l%2, pv=1-cur; for (int i=1; i<=n;i ++) { line nw=line(qs[i-1], dp[pv][i-1]-qs[i-1]*qs[i-1], i-1); while (dq.size()>1&&(dq[dq.size()-2].c-dq.back().c)*(nw.m-dq[dq.size()-2].m)<=(dq[dq.size()-2].c-nw.c)*(dq.back().m-dq[dq.size()-2].m)) dq.pop_back(); dq.push_back(nw); while (dq.size()>1&&dq[0].val(qs[i])<=dq[1].val(qs[i])) dq.pop_front(); dp[cur][i]=dq.front().val(qs[i]); back[l][i]=dq.front().idx; } } cout<<dp[k%2][n]<<'\n'; int tmp=n, ly=k; while (back[ly][tmp]) cout<<(tmp=back[ly--][tmp])<<' '; }
#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...