形式
形如
( a[x],b[x],c[x],d[x] a [ x ] , b [ x ] , c [ x ] , d [ x ] 为一些与x有关的式子)
(需保证b[x]满足单调性)
如果是min,则后面的过程反过来,自己理解去。
思路
为了
O(1)
O
(
1
)
选出最优的j,假设
dp[j]
d
p
[
j
]
优于
dp[k]
d
p
[
k
]
,且
b[j]>b[k]
b
[
j
]
>
b
[
k
]
即,
变成
所以要求 (dp[j]+c[j])−(dp[k]+c[k])b[j]−b[k] ( d p [ j ] + c [ j ] ) − ( d p [ k ] + c [ k ] ) b [ j ] − b [ k ] 斜率越大越好,用单调队列维护
把上面那个 b[j] b [ j ] 当做横坐标, (dp[j]+c[j]) ( d p [ j ] + c [ j ] ) 当做纵坐标。
维护的单调队列要使斜率要递减(保证前面的更大),画成图像就成了一个上凸包:
实现
对于一个新的 i i ,保证最大,队列的左边为 head h e a d ,判断head与head+1的斜率,如果head+1更优,即
那么就
head++;
所以 dp[i] d p [ i ] 就从head位置转移过来。
接下来把 dp[i] d p [ i ] 添加进单调队列,把队尾tail斜率比i小的全部弹出去,即
那么就
tail--;
最后把i放进tail里。