作用:维护区间最值。
前置:dequq头文件,双向队列,用于记录当前区间之中可能是最值的数的下标。
实现思路:
读入数据之后,对该数组进行遍历。
遍历的过程之中,若新数大于当前队列中的最大值,且队列不为空,则将队列中的数据弹出。
将新数加入到当前队列中。
如果当前队列的长度大于规定区间的长度,则将不在该区间的数据弹出。
最后在达到满区间之后,将区间最值输出。
#include<cstdio>
#include<deque>
using namespace std;
const int N=1e6+100;
int n,m;
int num[N];
deque<int>q;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&num[i]);
for(int i=1;i<=n;i++){
while(!q.empty()&&num[q.back()]<num[i])q.pop_back();
q.push_back(i);
while(i-q.front()+1>m)q.pop_front();
if(i>=m)printf("%d ",num[q.front()]);
}return 0;
}
/*
6 3
3 6 3 4 2 7
*/