Skip to content

斜率优化 笔记

推式子比代码长。

1. P3195 [HNOI2008] 玩具装箱

第一步:写出暴力

fi 表示前 i 个玩具的最小答案,si 表示 C 的前缀和。

fi=minj=1i1{fj1+(ij+sisj1L)2}

第二步:分流 & 拆式子

fi,j=fj1+(ij+sisj1L)2

即当 ij 这个位置转移时的最小答案。

将只和 i 有关的和只和 j 有关的提出来。

gi=i+siL[1]hi=i+si1

[1]:常数项放哪边或者哪边都不放均可,由于待会还要拆平方,虽然最后会被消掉,但是哪边都不放中间的式子就会很长。

fi,j=fj1+(gihj)2=fj1+gi22gihj+hj2

第三步:讨论后面的转移点比前面的更优的条件

j1<j2,且 j2j1 更优,即 fi,j1>fi,j2

fj11+gi22gihj1+hj12>fj21+gi22gihj2+hj22(fj11+hj12)(fj21+hj22)>2gi(hj1hj2)

yi=fi1+hi2

yj1yj2>2gi(hj1hj2)

s 单调递增,所以 h 也单调递增,所以 hj1hj2<0

yj1yj2hj1hj2<2gi

左边这个式子就相当于平面内经过 A(hj1,yj2)B(hj2,yj2) 的直线 AB 的斜率(就是一次函数的 k),也就是说当这个斜率小于 2gi 时,j2 更优。

第四步:单调队列维护

K(j1,j2)=yj1yj2hj1hj2

可以证明转移点间的斜率一定是单调递增的:

考虑反证法。当 j1<j2<j3K(j1,j2)>K(j2,j3) 时,假设 j2 是最优转移点。则 j2 优于 j1K(j1,j2)<2gij2 也优于 j3K(j2,j3)>2gi,即 K(j1,j2)<2gi<K(j2,j3),与条件矛盾,故假设不成立。

运用单调队列的思想,维护队列中相邻两个点的斜率单调递增,且保证队头和队头后一个点的斜率 >2gi,由于斜率单调递增,故前一个点总是优于后一个点,取队头就是答案。

所有情况的单调队列取法总结:

  • K(j1,j2)<gigi 单调增:维护队头斜率大于 gi,斜率单调增,转移取队头。

  • K(j1,j2)<gigi 单调减:维护队尾斜率小于 gi,斜率单调增,转移取队尾。

  • K(j1,j2)>gigi 单调增:维护队尾斜率大于 gi,斜率单调减,转移取队尾。

  • K(j1,j2)>gigi 单调减:维护队头斜率小于 gi,斜率单调减,转移取队头。

先删尾,再加入,再删头,再转移。

2.

简要题意:有一个长度为 n106 长度的数轴,除 0 号点外每个点上有个分数 ai。任选跳跃策略,从 0 号点跳到 n 号点,从 j 跳到 i 的收益是 ai(ij),求最大分数。

fi=maxj=0i1{fj+ai(ij)}

fi,j=fj+iaijai

j1<j2,且 fj1<fj2

fj1+iaij1ai<fj2+iaij2aifj1fj2<ai(j1j2)fj1fj2j1j2>ai

其他情况 1:与斜率比较的对象没有单调性

其实很好处理,根据大于号和小于号,单调队列维护递增还是递减的四条规律仍然适用,但是不能再保证队头或队尾和比较对象的关系,所以变成单调栈,然后二分找就行了。

3. P4655 [CEOI2017] Building Bridges

wiwi1+wifi=minj=1i1{fj+(hihj)2+wi1wj}

光速推柿子(因为没啥用),令 Gi=hi2+wi1Hi=fj+hj2wj,得到:

Hj1Hj2>2Hi(hj1hj2)

然后发现由于 h 没有单调性,连斜率小于 / 大于一个对象的形式都写不出来。

其他情况 2:斜率也没有单调性

把式子推回去到这:

fi=minj=1i1{fj+hi22hihj+hj2+wi1wj}

k=2hjb=fj+hj2wj

fi=hi2+wi1+minj=1i1{khi+b}

min 里的可以用 李超线段树 维护。相当于查询 x=hi 时,y 的最小值。由于插入的是直线而不是线段,所有数都是整数没有精度问题,而且只关心最小值的大小而不是编号,所以比模板好写多了。

不过要注意边界问题,第 0 条直线的 b0=

4. P4027 [NOI2007] 货币兑换

贪心,如果在第 j 天买入并在第 i 天卖出,那么肯定是在第 j 天全买第 i 天全卖最优。

pi,qi 分别表示第 ia,b 能买多少个:

pi=firiairi+bi,qi=fiairi+bifi=max(fi1,maxj=1i1{aipj+biqj})=max(fi1,maxj=1i1{bi(pjaibi+qj)})

把右边那一部分看成一次函数,李超线段树维护即可。

其他情况 2.1:x 坐标是小数

离散化即可,小心 unique 后炸精度。

更多类似题目

1/2. P3628 [APIO2010] 特别行动队 / SP15648 APIO10A - Commando

3. P5017 [NOIP2018 普及组] 摆渡车

4. P2900 [USACO08MAR] Land Acquisition G

最近更新