Submission #983054

#TimeUsernameProblemLanguageResultExecution timeMemory
983054Hugo1729Split the sequence (APIO14_sequence)C++11
0 / 100
65 ms131072 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll dp[100001][202]={0}; ll pref[100001]={0}; ll p[100001][202]; struct line{ ll m,c; line(ll _m, ll _c){m=_m;c=_c;} ll intersect(line l){ return m-l.m==0 ? LLONG_MAX/4 : (l.c-c)/(m-l.m); } ll value(ll x){ return m*x+c; } }; deque<pair<line,ll>> q; deque<ll> pos; void insert(ll m, ll c){ line l(m,c); while(!q.empty()&&q.front().second>l.intersect(q.front().first)){ // cout << "irem" << ' ' << q.front().first.m << ' ' << q.front().first.c << ' ' << q.front().second << '\n'; q.pop_front(); pos.pop_front(); } if(q.empty()){ q.push_front({l,0}); }else{ q.push_front({l,l.intersect(q.front().first)}); } // cout << "iadd" << ' ' << q.front().first.m << ' ' << q.front().first.c << ' ' << q.front().second << '\n'; } ll query(ll x){ while(q.size()>1&&q[q.size()-2].second<=x){ // cout << "qrem" << ' ' << q.back().first.m << ' ' << q.back().first.c << ' ' << q.back().second << '\n'; q.pop_back(); pos.pop_back(); } // cout << "query" << ' ' << q.back().first.m << ' ' << q.back().first.c << ' ' << q.back().second << ' ' << q.back().first.value(x) <<'\n'; return q.back().first.value(x); } int main(){ // cin.tie(0)->sync_with_stdio(0); int n, k; cin >> n >> k; vector<ll> a(n); for(int i=0;i<n;i++)cin >> a[i]; for(int i=0;i<n;i++)pref[i+1]=pref[i]+a[i]; for(int j=1;j<=k+1;j++){ q.clear(); pos.clear(); for(int i=1;i<=n;i++){ insert(pref[i-1],dp[i-1][j-1]-pref[i-1]*pref[n]); pos.push_front(i-1); dp[i][j]=query(pref[i])-pref[i]*pref[i]+pref[i]*pref[n]; p[i][j]=pos.back(); // for(int x=0;x<i;x++){ // if(dp[x][j-1]+(pref[i]-pref[x])*(pref[n]-pref[i])>=dp[i][j]){ // dp[i][j]=dp[x][j-1]+(pref[i]-pref[x])*(pref[n]-pref[i]); // p[i][j]=x; // } // cout << '(' << i << ' ' << j << ')' << dp[i][j] << ' ' << p[i][j] << ' '; } // cout << '\n'; } cout << dp[n][++k] << '\n'; int sus=p[n][k--]; while(k>0){ cout << sus << ' '; sus=p[sus][k--]; } 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...