单调队列模板+例题

单调队列是指:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。

单调队列顾名思义就是一个有规律的队列,这个队列的规律是:所有在队列里的数都必须按递增(或递减)的顺序列队。

例如:
有如下一串数字:1 5 3 4 2
首先第一个数字1先进队列,que = {1};
之后第二个数字5大于1,则1出队列5进队列,que = {5};
下一步第三个数字3小于5,进队列,que = {5,3};
下一步第四个数字4大于3,则3出队列4进队列,que = {5,4};
下一步第五个数字2小于4,进队列,que = {5,4,2};
这样最后队列里的数字为单调递减排列。

模板:

//que数组存储数据在a数组中的下标

que[++tail] = 1;//第一个数据先进入队列
for(int i = 2; i <= n; i++){
	while(head <= tail && i - que[head] == k)//判断最大的数是否在范围之内,若不在则出队列
		head++;
	while(head <= tail && a[i] >= a[que[tail]])//当新插入的数比队尾大时,弹出队尾的数
		tail--;
	que[++tail] = i; //新插入的数进入队列
	if(i >= k)
		printf("%d\n", a[que[head]]);
	}

例题:

洛谷2032扫描

#include<stdio.h>
#define maxn 2000001
int head = 1, tail = 0;
int a[maxn], que[maxn];

int main(){
	int n, k;
	scanf("%d %d", &n, &k);
	for(int i = 1; i <= n; i++){
		scanf("%d", &a[i]);
	}
	//单调队列递减,则队头为最大元素
	que[++tail] = 1;
	for(int i = 2; i <= n; i++){
		while(head <= tail && i - que[head] == k)//判断最大的数是否在范围之内,若不在则出队列
			head++;
		while(head <= tail && a[i] >= a[que[tail]])//当新插入的数比队尾大时,弹出队尾的数
			tail--;
		que[++tail] = i; //新插入的数进入队列
		if(i >= k)
		    printf("%d\n", a[que[head]]);
	}
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

21岁被迫秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值