洛谷 P1886 滑动窗口
单调队列:
单调递增队列:使得每个入队元素都小于已有元素
保持递增:遇到队尾元素小于未入队元素时,弹出队尾再使未入队元素入队
数据结构:deque,因为滑动窗口需要判断队列元素是否过时,而deque可以通过pop_front()弹出队首元素
每次滑动都记录队首元素即可。
#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
int arr[N];
int amax[N];
int amin[N];
int k;
int n;
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d", &arr[i]);
}
deque<int> qmax;
deque<int> qmin;
for(int i=0;i<k-1;i++){
while (!qmax.empty() && arr[qmax.back()] < arr[i])
{
qmax.pop_back();
}
qmax.push_back(i);
while (!qmin.empty() && arr[qmin.back()] > arr[i])
{
qmin.pop_back();
}
qmin.push_back(i);
}
for(int i=k-1;i<n;i++){
while(!qmax.empty()&&i-qmax.front()>=k){
qmax.pop_front();
}
while(!qmax.empty()&&arr[qmax.back()]<arr[i]){
qmax.pop_back();
}
qmax.push_back(i);
amax[i]=arr[qmax.front()];
while(!qmin.empty()&&i-qmin.front()>=k){
qmin.pop_front();
}
while(!qmin.empty()&&arr[qmin.back()]>arr[i]){
qmin.pop_back();
}
qmin.push_back(i);
amin[i]=arr[qmin.front()];
}
for(int i=k-1;i<n;i++){
printf("%d ",amin[i]);
}
cout<<endl;
for(int i=k-1;i<n;i++){
printf("%d ",amax[i]);
}
cout<<endl;
return 0;
}