快乐的一天从AC开始 | 20210712 | P2251
(暴露了鸽子本性,会补的会补的
今天开始写需求了,下午代码就写完了,调了一晚上没调好
心路历程
其实就是\(m\)遍区间最小值嘛,直接线段树/RMQ就可以\(O(n \log n)\)搞。
但是其实有\(O(n)\)的做法。
思路
单调队列。
首先是类似单调栈,加入元素的时候把前面大于它的都pop掉。可以这么想,后面的元素肯定比前面的元素晚pop,且因为要最小,所以新元素进来的时候,pop掉的都不可能是答案。
然后这样可以满足右端点的需求。
对于左端点,可以再维护一个指针指向单调栈的开头。加入元素的时候,一些开头的元素可能就不满足要求了,在加入元素之前不断移动左端点,把所有不满足区间限制元素pop掉。
(虽然复杂度优秀一点,但是相比线段树不支持修改操作
完结撒花。