单调队列模板

单调队列

适用于

   需要快速求出区间最大/最小值的情况(常用于dp优化)

相关算法

  线段树(单调队列代码量短,速度快,视题意选择)

  单调栈

原理/思路

  每次有元素进队时,找到合适的队尾接上,保证队列单调性。(删除后面不必要的一段)

  同时,维护可用区间,及时去头。

#include<bits/stdc++.h>
using namespace std;

int  n,m,a[1000],q[1000],h,t,ans[1000];
int main(){
    scanf("%d%d",&n,&m);//总共有n个数,区间长度为m 
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    h=1;t=0;
    for(int i=1;i<=n;i++){//以i为结尾 
        while(h<=t && a[q[t]]<=a[i])t--;//删去队尾的无用元素 
        q[++t]=i;//进队
        while(i-q[h]>=m)h++;//队头删去在所需区间外的元素 
        if(i>=m)ans[i-m+1]= a[q[h]];
    }
    for(int i=1;i<=n-m+1;i++)printf("%d--%d:%d\n",i,i+m-1,ans[i]);//打印区间最大值
    
}

 输入:

10 4
9 2 1 4 3 6 5 0 8 7

输出:

1--4:9
2--5:4
3--6:6
4--7:6
5--8:6
6--9:8
7--10:8

 

posted @ 2018-08-01 15:36  Zhangyihhh  阅读(598)  评论(0)    收藏  举报