栈的应用——单调栈
我们先考虑暴力做法:
1 |
|
结果当然是愉快的超时咯
单调栈的考虑思路类似双指针
假设从左到右扫描,每处理一个元素an时,在它入栈前,栈stk[]中维护的是 [a1…an-1]
我们可以发现,当stk中拥有元素ax ay且满足
a
x>ay; x<y
这样的话,不论后续的元素是什么,ay都会是更优的选择,题目要求的是 “靠右且更小的元素”
如图,将满足条件的红色逆序对全部删除后,我们可以得到一个单调上升的区间
对于随后每次扫描的an,从栈顶开始遍历,当栈顶的值>=an,便满足了上文所说的性质,an比att更小且更靠右
此时栈顶弹出,即代码中的这一段
1 | while(tt&&stk[tt]>=x) tt--; |
这一步进行完,如果栈中还有元素,那必定是满足性质的值
1 | if(tt) cout << stk[tt] << " "; |
做完别忘了把新的值压入栈
1 | stk[++tt] = x; |
完整的ac代码
1 |
|
以及从社区偷的一张dalao画的流程图
本文标题:栈的应用——单调栈
文章作者:meteor
发布时间:2022-10-03
最后更新:2022-10-03
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!
分享