제출 #46625

#제출 시각아이디문제언어결과실행 시간메모리
46625dqhungdl수열 (APIO14_sequence)C++17
100 / 100
616 ms83200 KiB
#include <bits/stdc++.h> using namespace std; struct Data { int64_t a,b; int id; }; typedef pair<int64_t,int> ii; int n,k,top,pointer,Trace[205][100005]; int64_t a[100005],f[100005]; Data S[100005]; bool Check(Data x1,Data x2,Data x3) { ///Intersection(x1,x2)=(x1.b-x2.b)/(x2.a-x1.a) ///Intersection(x1,x3)=(x1.b-x3.b)/(x3.a-x1.a) return (x1.b-x3.b)*(x2.a-x1.a)<=(x1.b-x2.b)*(x3.a-x1.a); } void Update(int64_t x,int64_t y,int id) { while(top>=2&&Check(S[top-1],S[top],{x,y,id})==true) top--; S[++top]={x,y,id}; } ii Query(int64_t x) { pointer=min(pointer,top); while(pointer<top&&S[pointer+1].a*x+S[pointer+1].b<=S[pointer].a*x+S[pointer].b) pointer++; return ii(S[pointer].a*x+S[pointer].b,S[pointer].id); } void Process(int kk) { top=0; pointer=1; Update(0,0,0); for(int i=1;i<=n;i++) { ii tmp=Query(a[i]); Update(-a[i],a[i]*a[i]-f[i],i); f[i]=-tmp.first; Trace[kk][i]=tmp.second; } } int main() { ios_base::sync_with_stdio(false); //freopen("TEST.INP","r",stdin); cin>>n>>k; for(int i=1;i<=n;i++) { cin>>a[i]; a[i]+=a[i-1]; } for(int i=1;i<=k;i++) Process(i); cout<<f[n]<<"\n"; while(k>0) { n=Trace[k][n]; k--; cout<<n<<' '; } }
#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...