P1886 滑动窗口 /【模板】单调队列
本文标题:P1886 滑动窗口 /【模板】单调队列
文章作者:gyro永不抽风
发布时间:2020年09月20日 - 16:09
最后更新:2020年09月20日 - 17:09
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 转载请保留原文链接及作者!
引言
再次写下这些东西,真的是感慨万千。从之前的只知道抄别人的,硬理解,到现在的查一下原理然后自己口胡,其中的辛酸大概也只有自己知道了。引用我很喜欢的一位数学老师的话:
只有体系建立起来了,才能办好事情。
单调队列的用途
一般来说,单调队列用在维护一个区间的极值上,即下面这两个式子:
$$ dp[i] = \min_{i - m < j \leq i} \{ a[j] \} $$
$$ dp[i] = \max_{i - m < j \leq i} \{ a[j] \} $$
正常情况下,时间复杂度应该为$O(mn)$。
单调队列的思想
单调队列,名为“单调”,意思就是队列当中元素是单调的。有一个很好的比方:你在排队买饭的时候,遇到比你弱的人,你就干掉然后插队,知道前面是比你强的人。这个时候你维护的就是一个单调递减的队列(因为你比你前面的人弱嘛),但是注意:你也在维护一个潜在的最大值的队列。
原因是这样的:当某个元素已经不在滑动窗口里面时,直接pop掉就行了,所以队首一定是区间最大值。
而区间最小值,只需要维护一个递增队列就行。
模板题目
题目描述
有一个长为 的序列 ,以及一个大小为 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。
例如:
The array is , and 。
输入格式
输入一共有两行,第一行有两个正整数 。 第二行 个整数,表示序列
输出格式
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值
输入输出样例
8 3 1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3 3 3 5 5 6 7
说明/提示
【数据范围】
对于 的数据,;
对于 的数据,,。
代码
1 |
|