之前写的是这样的:
for(re int i=1;i<=p;i++){
head=1;tail=0;q[++tail]=0;
for(re int j=1;j<=m;j++){
while(head<tail&&slope(q[head],q[head+1])<K(j))head++;
f[i][j]=Y(q[head])-K(j)*q[head]+j*A[j]-sum[j];
while(head<tail&&slope(q[tail-1],q[tail])<slope(q[tail-1],j))tail--;
q[++tail]=j;
}
}
改成这样就 A 了:
for(re int i=1;i<=p;i++){
head=1;tail=0;q[++tail]=0;
for(re int j=1;j<=m;j++){
while(head<tail&&Y(q[head])-Y(q[head+1])>K(j)*(q[head]-q[head+1]))head++;
f[i][j]=Y(q[head])+A[j]*(j-q[head])-sum[j];
while(head<tail&&(Y(j)-Y(q[tail-1]))*(q[tail]-q[tail-1])<(Y(q[tail])-Y(q[tail-1]))*(j-q[tail-1]))tail--;
q[++tail]=j;
}
}
可是这不是等价的吗,以前这么写没出过问题啊 ,难道是精度问题?