单调队列和简单斜率优化小结
我一直觉得单调队列和斜率优化都是很难理解的东西,事实上我也确实理解了很久。去年省选集训的时候学过一次,没学会;今年NOIP集训的时候又做了一题,还是没什么感觉;NOIP完了,又做了几题单调队列,还是看题解的……还好今年省选集训的时候还是弄懂了。
其实斜率优化之所以和单调队列关系这么大,原因还是大部分题目斜率优化能保证决策的单调性,不要的就扔掉,所以就用了单调队列了。既然单调队列这么重要,所以今年开始练斜率优化的时候我就先打了几题单调队列。
参考资料
单调队列
单调队列就是一定要想清楚,到底我什么时候该把头扔掉(一般删头是因为不满足题目要求,或者不够优并且不会在后面变优),到底我把什么样的尾扔掉(尾都是备胎,一般扔掉是因为当前尾由于当前状态的出现而变得一文不值,连当备胎的机会都没有)。
另外还有一个非常严重的问题,就是先维护队尾还是先维护队头。这个得取决于具体的DP方程,如果当前决策能选到自己的话,那就得先维护队尾再维护队头,最后把头那个决策拿出来算DP值。
斜率优化
因为斜率不单调的斜率优化我还没做出来(o(╯□╰)o),所以先不讨论斜率不单调的斜率优化。
总的来说,斜率优化就是这样:求最小值,维护下凸壳;求最大值,维护上凸壳。画个图还是比较容易理解的。转化出xy以后就变成模板了。
Read on →