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...