Submission #899990

#TimeUsernameProblemLanguageResultExecution timeMemory
8999901075508020060209tcSplit the sequence (APIO14_sequence)C++14
50 / 100
45 ms131072 KiB

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define X first
#define Y second
#define SZ(x) (int)(x).size()
int n;int K;
int ar[100005];
int ps[100005];
int dp[100005][205];
signed frm[100005][205];
deque<int>dq[205];

int f(int x,int id,int k){
return ps[id]*x+dp[id][k]-ps[id]*ps[id];
}
bool chk(int id1,int id2,int id3,int k){

int a1;int a2;int a3;int b1;int b2;int b3;
a1=ps[id1];a2=ps[id2];a3=ps[id3];
b1=dp[id1][k]-ps[id1]*ps[id1];
b2=dp[id2][k]-ps[id2]*ps[id2];
b3=dp[id3][k]-ps[id3]*ps[id3];
if(a2==a3){return b3<=b2;}
//return (b2-b1)/(a1-a2)>=(b3-b1)/(a1-a3);
return (b2-b1)*(a1-a3)>=(b3-b1)*(a1-a2);
}
signed main(){



cin>>n>>K;
K+=1;
for(int i=1;i<=n;i++){
    cin>>ar[i];
    ps[i]=ar[i]+ps[i-1];
}
dp[1][1]=0;
for(int i=0;i<=K;i++){
    dq[i].push_back(0);
}
for(int i=1;i<=n;i++){

    for(int j=K;j>=2;j--){
        while(dq[j-1].size()>=2&&f(ps[i],dq[j-1].front(),j-1)<=f(ps[i],dq[j-1][1],j-1)){dq[j-1].pop_front();}
        dp[i][j]=f(ps[i],dq[j-1].front(),j-1);
        frm[i][j]=dq[j-1].front();
        while(dq[j].size()>=2&&chk(dq[j][0],dq[j][1],i,j)){dq[j].pop_back();}
        dq[j].push_back(i);
        /*
        for(int k=1;k<=i;k++){
            dp[i][j]=max(dp[i][j],dp[k-1][j-1]+(ps[i]-ps[k-1])*(ps[k-1]));
            if(dp[i][j]==dp[k-1][j-1]+(ps[i]-ps[k-1])*(ps[k-1])){
                frm[i][j]=k-1;
            }
        }*/
    }
    int j=1;
    while(dq[j].size()>=2&&chk(dq[j][0],dq[j][1],i,j)){dq[j].pop_back();}
    dq[j].push_back(i);
}
/*
for(int i=1;i<=n;i++){
    for(int j=1;j<=K;j++){
        cout<<dp[i][j]<<" ";
    }cout<<"\n";
}*/

cout<<dp[n][K]<<"\n";

int nw=n;
int k=K;
vector<int>vc;
for(int i=1;i<=K-1;i++){
    nw=frm[nw][k];
    vc.push_back(nw);
    k--;
}
reverse(vc.begin(),vc.end());
for(int i=0;i<vc.size();i++){
    cout<<vc[i]<<" ";
}


}

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:82:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 | for(int i=0;i<vc.size();i++){
      |             ~^~~~~~~~~~
#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...