单调队列模板
单调队列
适用于
需要快速求出区间最大/最小值的情况(常用于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

浙公网安备 33010602011771号