大佬们要让蒟蒻给他们讲斜率优化 …….(色色发抖
斜率优化是什么呢,先看点没用的东西。
考虑一类动态规划,满足这样的性质:
状态数有n个,一个状态的决策数有
形似f[i]=♂i1f[j]定义♂为乱七八糟的运算
这样的dp有什么好的性质呢???
首先考虑这样一种 子类型
当对于一个w[j,i]满足四边形不等式的时候,决策单调
那么我们首先来说什么叫四边形不等式
w[i,j]+w[i+1,j+1]≤w[i+1,j]+w[i,j+1]
是不是一脸蒙蔽?
其实是网上的柿子非得撞壁,写成这个13样,不信你移个项
w[i+1,j+1]−w[i+1,j]≤w[i,j+1]−w[i,j]
就是这样的,对于i+1状态的决策集,j位置决策的增长幅度不如在
显然这意味着,如果一个决策在i位置就已经被淘汰,无论他怎么跑,都追不上其他在
对于状态x的两个决策位置
这有啥用啊?就是把你原来从1枚举变成从
还是暴力,有个卵用?
那我们换一个角度思考,之前都是对状态想决策,现在变成对决策想状态。
对于一个决策j能决策的状态区间是什么,一定是状态集中的一段连续的区间
所以我们可以考虑这样一个问题,(以下数字表示决策点位置编号)
对于决策1有这样的决策区间
对于决策2来了,他一定决策这样的区间
1111122222
以此类推
所以我们对每个决策点决策区间维护单调栈,每来一个决策,就在单调栈中二分决策点变化位置,弹掉后面的区间,拆开当前区间即可
废话说完了
斜率优化是个啥???
考虑这样另一种形式的子类型
美化以下柿子
f[i]=mini−1j=1(a[i]∗x[j]+b[i]∗y[j])
求a∗x+b∗y的最值?
变成斜截式y=−ba∗x+Pb
现在一个决策点变成了一个数对,(x,y)
问题转化成了给定一些斜率固定的直线,以及二维平面上的点集
求一条直线在平面上穿过某一点使得与y轴截距最值
直线方程?线性规划??
显然是卡在凸包上的最优啊
下面分情况讨论
如果x是递增的,斜率也是递增的
就相当于一边向后插点维护凸包,一边在前面用直线卡掉不合法的点
显然单调队列,队尾插点,队头按直线弹掉,时间复杂度
如果x递增,斜率不递增,就要正常维护凸包,在凸包上二分找到直线卡的点位置。
时间复杂度O(n∗log2n)
如果x和斜率都不递增,用平衡树维护凸包,动态插点,删点,反正我不会写。
可写的方法是cdq,对x进行cdq,左右分别维护凸包,O(n)合并凸包。
时间复杂度O(n∗log2n)