제출 #7084

#제출 시각아이디문제언어결과실행 시간메모리
7084baneling100수열 (APIO14_sequence)C++98
100 / 100
576 ms82728 KiB
#include <stdio.h> int N, K, Path[202][100002], S[100002], Top, Ans[202]; long long A[100002], D[2][100002]; void input(void) { int i; scanf("%d %d",&N,&K); for(i=1 ; i<=N ; i++) { scanf("%lld",&A[i]); A[i]+=A[i-1]; } } void process(void) { int i, j, k, x, now; long long a, b, c, d, e, f; for(j=1 ; j<=K ; j++) { x=j%2; Top=0; now=1; for(k=j ; k<=N ; k++) { if(Top<2) S[++Top]=k; else { a=A[S[Top-1]]; b=D[1-x][S[Top-1]]-A[S[Top-1]]*A[S[Top-1]]; c=A[S[Top]]; d=D[1-x][S[Top]]-A[S[Top]]*A[S[Top]]; e=A[k]; f=D[1-x][k]-A[k]*A[k]; while(Top>=2 && (d-b)*(e-a)<=(c-a)*(f-b)) { Top--; a=A[S[Top-1]]; b=D[1-x][S[Top-1]]-A[S[Top-1]]*A[S[Top-1]]; c=A[S[Top]]; d=D[1-x][S[Top]]-A[S[Top]]*A[S[Top]]; } S[++Top]=k; } a=A[S[now]]*A[k+1]+D[1-x][S[now]]-A[S[now]]*A[S[now]]; b=A[S[now+1]]*A[k+1]+D[1-x][S[now+1]]-A[S[now+1]]*A[S[now+1]]; while(now<k && a<b) { now++; a=A[S[now]]*A[k+1]+D[1-x][S[now]]-A[S[now]]*A[S[now]]; b=A[S[now+1]]*A[k+1]+D[1-x][S[now+1]]-A[S[now+1]]*A[S[now+1]]; } D[x][k+1]=a; Path[j][k+1]=S[now]; } } a=N; for(i=K ; i>=1 ; i--) { Ans[i]=Path[i][a]; a=Path[i][a]; } } void output(void) { int i; printf("%lld\n",D[K%2][N]); for(i=1 ; i<=K ; i++) printf("%d ",Ans[i]); } int main(void) { input(); process(); output(); 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...