Submission #59667

#TimeUsernameProblemLanguageResultExecution timeMemory
59667KLPPSplit the sequence (APIO14_sequence)C++14
0 / 100
123 ms12248 KiB
#include<stdio.h> #include<iostream> #include<vector> using namespace std; typedef long long int lld; #define INF 1000000000000000000 typedef pair<lld,lld> pii; lld sq(lld x){ return x*x; } bool cmp(pii l1, pii l2, pii l3){ lld a=l3.first-l2.first; lld b=l2.second-l3.second; lld c=l2.first-l1.first; lld d=l1.second-l2.second; if(a*d>b*c)return true; return false; } class CH{ vector<pii> points; vector<pii>lines; vector<int> index; public: void add(pii line,int indice){ while(lines.size()>1 && cmp(lines[lines.size()-2],lines[lines.size()-1],line)){ lines.pop_back(); points.pop_back(); index.pop_back(); } if(lines.size()>0){ pii a=pii(line.second-lines[lines.size()-1].second,-line.first+lines[lines.size()-1].first); points.push_back(a); } lines.push_back(line); index.push_back(indice); } int query(lld x){ //cout<<points.size()<<endl; if(lines.size()==0)return -1; int lo,hi; lo=-1; hi=points.size();//cout<<lo<<hi<<endl; while(hi-lo>1){ int mid=(hi+lo)/2; if(points[mid].first<x*points[mid].second){//cout<<mid<<endl; lo=mid; }else hi=mid; }//cout<<lo<<hi<<endl; //for(int i=0;i<points.size();i++)cout<<points[i].first<<" "<<points[i].second<<endl; return index[hi]; } int size(){ return lines.size(); } void print(){ for(int i=0;i<index.size();i++)cout<<index[i]<<" "; cout<<endl; } }; int main(){ int n,k; scanf("%d %d",&n,&k); lld arr[n]; for(int i=0;i<n;i++){ scanf("%lld",&arr[i]); } lld DP[n+1][k+2]; int prev[n+1][k+2]; lld acc[n+1]; acc[0]=0; for(int i=0;i<n;i++){ acc[i+1]=acc[i]+arr[i]; } for(int i=0;i<=n;i++){ for(int j=0;j<=k+1;j++){ DP[i][j]=INF; prev[i][j]=-1; } } DP[0][0]=0; for(int parts=0;parts<=k;parts++){ CH a;//cout<<"A"<<endl; for(int j=0;j<=n;j++){ prev[j][parts+1]=a.query(acc[j]); if(DP[j][parts]!=INF){ a.add(pii(-2*acc[j],acc[j]*acc[j]+DP[j][parts]),j); } if(prev[j][parts+1]!=-1){ int i=prev[j][parts+1]; DP[j][parts+1]=DP[i][parts]+sq(acc[j]-acc[i]); } //cout<<a.query(acc[j])<<" "<<a.size()<<" "; //a.print(); }//cout<<endl; } /*for(int i=0;i<k+2;i++){ for(int j=0;j<=n;j++){ if(DP[j][i]==INF)cout<<"-1 "; else cout<<DP[j][i]<<" "; }cout<<endl; } for(int i=0;i<k+2;i++){ for(int j=0;j<=n;j++){ cout<<prev[j][i]<<" "; }cout<<endl; }*/ lld ans=sq(acc[n])-DP[n][k+1]; ans/=2; printf("%lld\n",ans); int index=n; int partition=k+1; while(index>0){ index=prev[index][partition]; partition--; if(index>0)printf("%d ",index); } printf("\n"); /*int m; cin>>m; CH a; pii arr[m]; for(int i=0;i<m;i++){ int x,y; cin>>x>>y; if(x==-1){ cout<<a.query(y)<<endl; }else{ a.add(pii(x,y),i); arr[i]=pii(x,y); } }*/ return 0; }

Compilation message (stderr)

sequence.cpp: In member function 'void CH::print()':
sequence.cpp:56:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int i=0;i<index.size();i++)cout<<index[i]<<" ";
                ~^~~~~~~~~~~~~
sequence.cpp: In function 'int main()':
sequence.cpp:62:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n,&k);
  ~~~~~^~~~~~~~~~~~~~~
sequence.cpp:65:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld",&arr[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...