Submission #138214

#TimeUsernameProblemLanguageResultExecution timeMemory
138214Runtime_error_Split the sequence (APIO14_sequence)C++14
71 / 100
499 ms131076 KiB
//APIO 2014 Split the sequence #include <bits/stdc++.h> #define ll long long using namespace std; const ll inf=1e5+9,K=209,MX=1e9+9; ll n,k,ans=-MX,idx; ll pre[inf],a[inf]; pair<ll,ll> dp[K][inf]; vector<ll> split; struct line { ll m, c,idx; ll eval(ll x) { return m * x + c; } #define ld long double ld intersectX(line l) { assert(l.m != m); return (ld) (c - l.c) / (l.m - m); } }; struct LineContainer{ //for maximum // m increasing and x increasing //to get m is decreasing x is decreasing -m , -x deque<line> dq; #define last dq.size()-1 void add(ll m,ll p,ll idx){ line cur = {m,p,idx}; while (dq.size() >= 2 && dq[last-1].intersectX(cur) <= dq[last-1].intersectX(dq[last])) dq.pop_back(); dq.push_back(cur); } pair<ll,ll> query(ll x){ while (dq.size() >= 2 && dq[0].eval(x) <= dq[1].eval(x)) dq.pop_front(); return make_pair(dq[0].eval(x),dq[0].idx); } }; int main(){ cin>>n>>k; for(ll i=1;i<=n;i++) cin>>a[i],pre[i]=pre[i-1]+a[i]; for(ll j=1;j<=k;j++){ LineContainer lc; lc.add(pre[j-1],dp[j-1][j-1].first - pre[j-1]*pre[n],j-1); for(ll i=j;i<=n;i++){ dp[j][i] = lc.query(pre[i]); dp[j][i].first += pre[i]*pre[n] - pre[i]*pre[i] ; lc.add(pre[i],dp[j-1][i].first-pre[i]*pre[n],i); } } for(ll i=1;i<=n;i++) if(ans<dp[k][i].first) ans=dp[k][i].first,idx=i; split.push_back(idx); for(ll j=k;j>1;j--) idx=dp[j][idx].second,split.push_back(idx); reverse(split.begin(),split.end()); cout<<ans<<endl; for(auto o:split) cout<<o<<" "; cout<<endl; }
#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...