裸斜率优化,不解释
//By YY_More
#include<cstdio>
struct point{
int x,y;
} D[500010],now;
int sum[500010];
int N,M,L,R;
int xmul(point a,point b,point c){
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
int main(){
while (~scanf("%d%d",&N,&M)){
sum[0]=0;
for (int i=1;i<=N;i++){
scanf("%d",&sum[i]);
sum[i]+=sum[i-1];
}
L=R=0;D[0].x=0;D[0].y=0;
for (int i=1;i<=N;i++){
while (L<R&&D[L].y-2*sum[i]*D[L].x>=D[L+1].y-2*sum[i]*D[L+1].x) L++;
now.x=sum[i];now.y=D[L].y-2*sum[i]*D[L].x+M+2*sum[i]*sum[i];
while (L<R&&xmul(D[R-1],D[R],now)<=0) R--;
D[++R]=now;
}
printf("%d\n",D[R].y-sum[N]*sum[N]);
}
return 0;
}
浙公网安备 33010602011771号