单调队列维护每个区间中有可能能成为最值的数即可
队列存元素下标(否则不知道怎么判断队内元素已经超出窗口了)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 1e6+5;
int n,k;
int a[Nmax];
deque<int> max_dq,min_dq;
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin>>n>>k;
for(int i = 1;i <= n;i++)
cin>>a[i];
for(int i = 1;i <= n;i++){ //求最小值
if(!min_dq.empty())
if(min_dq.size() == k || i - min_dq.back() >= k)
min_dq.pop_back();
while(!min_dq.empty() && a[min_dq.front()] > a[i]) min_dq.pop_front();
min_dq.push_front(i);
if(i >= k) cout<<a[min_dq.back()]<<' ';
}
cout<<'\n';
for(int i = 1;i <= n;i++){ //求最大值
if(!max_dq.empty())
if(max_dq.size() == k || i - max_dq.back() >= k)
max_dq.pop_back();
while(!max_dq.empty() && a[max_dq.front()] < a[i]) max_dq.pop_front();
max_dq.push_front(i);
if(i >= k) cout<<a[max_dq.back()]<<' ';
}
return 0;
}