洛谷P1886--滑动窗口(单调队列模板)

时间:2021-10-05 21:46:01

https://www.luogu.org/problemnew/show/P1886

单调队列的操作上比普通队列多了可以从尾端出队

单调队列保持队内元素单调递增/递减,以保证队首元素为最小/最大元素

详细解释https://www.luogu.org/problemnew/solution/P1886

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> a;
vector<int> q;
int n,k;
void findMin(){
int head=,tail=;
for(int i=;i<=n;i++){
while(head<=tail&&q[head]+k<=i)
head++;
while(head<=tail&&a[q[tail]]>a[i])
tail--;
q[++tail]=i;
if(i>=k)
cout<<a[q[head]]<<' ';
}
cout<<endl;
}
void findMax(){
int head=,tail=;
for(int i=;i<=n;i++){
while(head<=tail&&q[head]+k<=i)
head++;
while(head<=tail&&a[q[tail]]<a[i])
tail--;
q[++tail]=i;
if(i>=k)
cout<<a[q[head]]<<' ';
}
cout<<endl;
}
int main(){
cin>>n>>k;
a.resize(n+);
q.resize(n+);
for(int i=;i<=n;i++)
cin>>a[i];
findMin();
findMax();
return ;
}