Submission #1151376

#TimeUsernameProblemLanguageResultExecution timeMemory
1151376AlgorithmWarriorSplit the sequence (APIO14_sequence)C++20
71 / 100
116 ms196608 KiB
#pragma GCC optimize ("03,unroll-loops")
#include <bits/stdc++.h>

using namespace std;

int const MAX=1e5+5;
long long dp[MAX][205];
int ult[MAX][205];
long long sp[MAX];
int n,k;

void read(){
    cin>>n>>k;
    ++k;
    int i;
    for(i=1;i<=n;++i){
        cin>>sp[i];
        sp[i]+=sp[i-1];
    }
}

long long aa(int i){
    return sp[i];
}

long long bb(int i,int dim){
    return dp[i][dim]-sp[i]*sp[i];
}

double inters(int i,int j,int dim){
    return 1.0*(bb(j,dim)-bb(i,dim))/(aa(i)-aa(j));
}

void get_dp(){
    int i,j;
    for(j=2;j<=k;++j){
        deque<int>deq;
        deq.push_back(j-1);
        for(i=j;i<=n;++i){
            while(deq.size()>1 && inters(deq[0],deq[1],j-1)<=1.0*sp[i])
                deq.pop_front();
            int ind=deq[0];
            dp[i][j]=bb(ind,j-1)+aa(ind)*sp[i];
            ult[i][j]=ind;
            if(sp[deq.back()]==sp[i]){
                ind=deq.back();
                if(bb(i,j-1)<=bb(ind,j-1))
                    continue;
                deq.pop_back();
            }
            while(deq.size()>1 && inters(deq.back(),deq[deq.size()-2],j-1)>=inters(i,deq.back(),j-1))
                deq.pop_back();
            deq.push_back(i);
        }
    }
}

void write(){
    cout<<dp[n][k]<<'\n';
    stack<int>stv;
    int i;
    int ind=n;
    for(i=k;i>1;--i){
        ind=ult[ind][i];
        stv.push(ind);
    }
    while(!stv.empty()){
        cout<<stv.top()<<' ';
        stv.pop();
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    read();
    get_dp();
    write();
    return 0;
}
#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...