Submission #1295730

#TimeUsernameProblemLanguageResultExecution timeMemory
1295730NewtonabcSplit the sequence (APIO14_sequence)C++20
100 / 100
546 ms82668 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
ll dp[2][N],arr[N],sum[N];
int ind[205][N];
struct CHT{
    struct line{
        ll m,c;
        double cut(line b){return (double)(b.c-c)/(double)(m-b.m);}
        ll val(ll x){return m*x+c;};
    };
    deque<pair<line,int>> hull;
    bool bad(line a,line b,line c){return c.cut(b)<=c.cut(a);}
    void ins(ll m,ll c,int i){
        line l={m,c};
        while(hull.size()>=2 && bad(hull.end()[-2].first,hull.back().first,l)) hull.pop_back();
        hull.push_back({l,i});
    }
    pair<ll,int> query(ll x){
        while(hull.size()>=2 && hull[0].first.val(x)<=hull[1].first.val(x)) hull.pop_front();
        return {hull[0].first.val(x),hull[0].second};
    }
    void clr(){while(!hull.empty()) hull.pop_back();}
}hode;
int main(){
    int n,k;
    cin>>n >>k;
    for(int i=1;i<=n;i++) cin>>arr[i];
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+arr[i];
    for(int i=1;i<=k+1;i++){
        int now=i&1;
        int pre=(i+1)&1;
        hode.ins(0,0,0);
        for(int j=1;j<=n;j++){
            pair<ll,int> ret=hode.query(sum[j]);
            if(i!=1) ind[i][j]=ret.second;
            dp[now][j]=sum[j]*(sum[n]-sum[j])+ret.first;
            if(i!=1) hode.ins(sum[j],dp[pre][j]-sum[j]*sum[n],j);
        }
        hode.clr();
    }
    cout<<dp[(k+1)&1][n] <<"\n";
    vector<int> ans;
    int now=n;
    for(int i=k+1;i>=2;i--){
        now=ind[i][now];
        ans.push_back(now);
    }
    reverse(ans.begin(),ans.end());
    for(auto tmp:ans) cout<<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...