一道题A两遍,舒适。
题目描述
现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。
例如:
The array is [1 3 -1 -3 5 3 6 7], and k = 3.
输入输出格式
输入格式
输入一共有两行,第一行为n,k。
第二行为n个数(<INT_MAX).
输出格式
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值
INPUT & OUTPUT’s examples
Input’s eg #1
1 | 8 3 |
Output’s eg #1
1 | -1 -3 -3 -3 3 3 |
数据说明
50%的数据,$n \leq 10^5$
100%的数据,$n \leq 10^6$
分析
又是RMQ问题,不过指定区间不是输入数据,而是滑动的指定长度的一段范围。
所以线段树大法好啊!
$n \leq 10^6$你写个锤子线段树!
那么,我们就可以考虑单调队列了。
维护两个单调队列,一个递增,一个递减,维护最值查询。
然后开两个线性表Max[]
和Min[]
记录指定长度内单调队列中的最值(队头)
代码
1 | /* Headers */ |