单调队列有两个性质
-
队列中的元素其对应在原来的列表中的顺序必须是单调递增的。
-
队列中元素的大小必须是单调递*(增/减/甚至是自定义也可以)
单调队列与普通队列不一样的地方就在于单调队列既可以从队首出队,也可以从队尾出队。
单调队列有许多作用:
比如可以求出一个数组内第一个大于等于一个数x的数
也可以通过维护单调性,解决一些区间内最小或最大的问题
题意:给定区间,每次移动一段区间,求区间里的最大值与最小值。
思路:单调队列模拟,单调队列的入门题。
#include<bits/stdc++.h>
using namespace std;
int q[1000005],p[1000005],a[1000005];
int n,k;
void minqueue(){
int head=0,tail=-1;
for(int i=1;i<=n;i++){
while(head<=tail&&q[tail]>=a[i])
tail--;
q[++tail]=a[i];
p[tail]=i;
while(p[head]<=i-k)
head++;
if(i>=k)
printf("%d ",q[head]);
}
printf("\n");
}
void maxqueue(){
int head=0,tail=-1;
for(int i=1;i<=n;i++){
while(head<=ta