单调队列和简单斜率优化小结
我一直觉得单调队列和斜率优化都是很难理解的东西,事实上我也确实理解了很久。去年省选集训的时候学过一次,没学会;今年NOIP集训的时候又做了一题,还是没什么感觉;NOIP完了,又做了几题单调队列,还是看题解的……还好今年省选集训的时候还是弄懂了。
其实斜率优化之所以和单调队列关系这么大,原因还是大部分题目斜率优化能保证决策的单调性,不要的就扔掉,所以就用了单调队列了。既然单调队列这么重要,所以今年开始练斜率优化的时候我就先打了几题单调队列。
参考资料
单调队列
单调队列就是一定要想清楚,到底我什么时候该把头扔掉(一般删头是因为不满足题目要求,或者不够优并且不会在后面变优),到底我把什么样的尾扔掉(尾都是备胎,一般扔掉是因为当前尾由于当前状态的出现而变得一文不值,连当备胎的机会都没有)。
另外还有一个非常严重的问题,就是先维护队尾还是先维护队头。这个得取决于具体的DP方程,如果当前决策能选到自己的话,那就得先维护队尾再维护队头,最后把头那个决策拿出来算DP值。
斜率优化
因为斜率不单调的斜率优化我还没做出来(o(╯□╰)o),所以先不讨论斜率不单调的斜率优化。
总的来说,斜率优化就是这样:求最小值,维护下凸壳;求最大值,维护上凸壳。画个图还是比较容易理解的。转化出xy以后就变成模板了。
单调队列例题
- hdu3401
- hdu3530
- poj3017
- poj3245 (二分第三问答案,预处理第一问,然后把poj3017复制过来就对了)
斜率优化例题
- poj2018
- hdu2993
- bzoj1010
- hdu3507
- bzoj1911
- bzoj1096
- hdu2829(二维的看起来很吓人,但是决策那维还是一维的)
poj3245 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
|
bzoj1010 代码(可以当模板了)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
hdu2829 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|