单调栈和单调队列
其实我栈和队列学的不太好
这有点伤......
单调栈及单调队列是维护顺序排列(升序或降序)的一种数据结构
非常类似于DP中的最优状态保存和查询
因此可用单调队列维护DP
维护的手段就是如果满足单调性加入,不满足单调性退出
遍历时间O(n),但是查最值的开销就是O(1)
保证及时更新单调栈或单调队列数据即可
有的可以用单调队列优化成O(n)
求双最值的多跑几遍就行了
有二维的就嵌套就行了
有特殊性质的特判掉就行了
单调栈/队列本身构造不难,难的是如何构造以及以后的维护过程
比较好用的除了优化DP,还有预处理维护区间最值范围
见到最大/最小的数据结构问题考虑单调栈就对了
然后还有就是队列维护最优决策
包括单调队列优化,斜率优化,四边形不等式
还有就是nlogn的LIS也可以二分单调栈
不过最后一个我更倾向于std::set

浙公网安备 33010602011771号