问题描述
有一个长为 的序列 ,以及一个大小为 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。
例如:
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
数据范围
对于 的数据,;
对于 的数据,,。
解决方案
思路
单调队列
代码
#include <iostream>
#include <queue>
using namespace std;
const int N = 1e6 + 5;
int n, k;
int arr[N];
int main() {
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
}
deque<int> qmin;
for (int i = 1; i <= n; ++i) {
while (!qmin.empty() && arr[i] <= arr[qmin.back()])
qmin.pop_back();
qmin.push_back(i);
if (i >= k) {
while (!qmin.empty() && qmin.front() <= i - k)
qmin.pop_front();
cout << arr[qmin.front()] << " ";
}
}
cout << endl;
deque<int> qmax;
for (int i = 1; i <= n; ++i) {
while (!qmax.empty() && arr[i] >= arr[qmax.back()])
qmax.pop_back();
qmax.push_back(i);
if (i >= k) {
while (!qmax.empty() && qmax.front() <= i - k)
qmax.pop_front();
cout << arr[qmax.front()] << " ";
}
}
return 0;
}