斜率优化dp

本文搬运自本人高中时期CSDN博客,若图片加载不出来,可到原文查看:https://blog.csdn.net/zhangtingxiqwq/article/details/133955843

fi=min(ajj×i)f_i=\min(a_j - j \times i)

考虑变成点对 (j,aj)(j,a_j) ,则 fi=YjXjif_i=Y_j-X_ji

i=k,fi=bi=k, f_i=b ,得 b=YjXjkb=Y_j-X_jk ,即 Yj=Xjk+bY_j=X_jk+b

我们希望 bb 尽量小,也就是截距尽可能小,即下图红色部分

在这里插入图片描述

对于点对,我们维护凸壳

在这里插入图片描述

可以发现,在第一个切的地方我们可以取截距最小

维护凸壳采用的是单调队列,我们维护两点之间斜率递增

如果新加入的点会使斜率递减,则把队尾的点pop掉

然后我们就可以二分 / 决策单调性了