首页 > 其他分享 >单调队列模板

单调队列模板

时间:2023-08-13 21:57:19浏览次数:33  
标签:队列 int num dmin 模板 单调

好的,这是一个晴朗的夜晚。

- 苯荏水平不高甚至菜亖,博客仅仅写给自己避免自己忘记学了什么,也仅据我理解写出,不严谨,非常不严谨。

单调队列。

在原序列基础上,维护一个单调的序列。

单调队列中的元素在原序列中的相对位置不变,且在单调队列中的元素是单调的。

基本模板题:https://www.luogu.com.cn/problem/P1886

代码:

//Luogu P1886滑动窗口模板/单调队列
//心有志向,则无畏阻挡
#include <bits/stdc++.h>
using namespace std;
int n, k;
const int N = 1e6 + 5;
struct stu {
    int id, num;//表示元素在原序列中的序号与对应的值
};
stu now, a[N];
deque<stu>dmax, dmin;//维护两个单调队列,分别维护区间最大值与区间最小值
int main() {
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i].num);
        a[i].id = i;
    }//read
    for (int i = 1; i <= n; i++) {//求区间最小值
        now = a[i];
        while (!dmin.empty() && dmin.back().num >= now.num) {
            //若之前的右端数字大于当前数字,则右端数字不可能为当前区间最小值
            //维护一个单调递增序列
            dmin.pop_back();
        }
        while (!dmin.empty() && dmin.front().id <= i - k) {//窗格内的数量超过k了。数量为i-k+1,减去当前元素则是i-k
            dmin.pop_front();
        }
        dmin.push_back(now);//放入当前元素
        if (i >= k) {
            printf("%d ", dmin.front().num);
        }//如果窗格长度>k
    }//min
    puts(" ");
    for (int i = 1; i <= n; i++) {
        now = a[i];
        while (!dmax.empty() && dmax.back().num <= now.num) {
            dmax.pop_back();
        }
        while (!dmax.empty() && dmax.front().id <= i - k) {
            dmax.pop_front();
        }
        dmax.push_back(now);
        if (i >= k) {
            printf("%d ", dmax.front().num);
        }
    }//max
    return 0;
}

 

标签:队列,int,num,dmin,模板,单调
From: https://www.cnblogs.com/Seshen/p/17627342.html

相关文章

  • java8 时间模板中 year 和 year-of-era 的不同
    Java8在表示时间的时候引入了一个u激发了我的好奇心,下面给大家讲解下两个的不同:year字段表示公历年份,其值可以是正数或负数,从-999,999,999到999,999,999。year-of-era字段表示日历纪元内的年份,其值范围从1到正无穷大。两者的区别在于:year字段直接表示公历年份,不受纪元......
  • tarjan模板
    ilvoidtarjan(intu){ dfn[u]=low[u]=++num,st[++top]=u,ins[u]=1; G(i,u) { intv=ver[i]; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } elseif(ins[v])low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { intt=0; cnt++; do......
  • LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • 如何在C语言中实现队列和堆栈的动态扩容
    如何在C语言中实现队列和堆栈的动态扩容队列和堆栈是在C语言中常用的数据结构,它们可以帮助我们高效地处理数据。然而,在实际编程中,我们经常会遇到数据量超过容量限制的情况。这时,我们需要实现队列和堆栈的动态扩容,以满足实际需求。6如何在C语言中实现队列和堆栈的动态扩容动态扩......
  • 数据结构与算法 --- 组数、链表、栈和队列(一)
    数组、链表、栈和队列是四种基础数据结构,他们是高级、复杂的数据结构和算法的基础。本篇先来讲述数组,链表,及算法的优化策略。数组定义数组:数组是一种线性表数据结构,它用一组连续的内存空间存储一组具有相同类型的数据。定义中有三个关键词:线性表连续的内存空间相同类型数......
  • 数据结构与算法 --- 组数、链表、栈和队列(二)
    继数据结构与算法---组数、链表、栈和队列(一)讲解完数组,链表及算法的优化策略之后,接下来继续讲解两种特殊的线性表结构,栈和队列。栈对“栈”有一个很形象的比喻,栈就像一摞叠在一起的盘子,放盘子时,只能放在上面,不能将盘子插入到中间的任意位置;取盘子时,只能从最上面取,不能从中间任......
  • [第358场周赛]分解质因数+单调栈+快速幂
    最近有点水逆,希望厄运赶快退散,一会会去祈福的。这场周赛依旧是3题遗憾离场,第4题经过提示其实涉及的算法都会但是实在是emmmm过于综合。7023. 操作使得分最大提示困难10相关企业给你一个长度为 n 的正整数数组 nums 和一个整数 k 。一开始,你的分数为 1 。你可以进行以下操......
  • 循环队列
    机器翻译#include<algorithm>#include<fstream>#include<iostream>#include<map>#include<memory>#include<set>#include<string>#include<vector>#defineDEBUGusingnamespacestd;template<typename......
  • 最大流模板
    需要注意的是要ll就全ll,不然要出事。structFlow{lltot=1,hd[N],ne[M],to[M],lim[M];voidAdd(intx,inty,llz){ne[++tot]=hd[x];hd[x]=tot;to[tot]=y;lim[tot]=z;ne[++tot]=hd[y];hd[y]=tot;to[tot]=x;lim[tot]=0;}llT,dis[......
  • 循环队列
    C语言实现#include<stdio.h>#defineMAX_SIZE10typedefstruct{intqueue[MAX_SIZE];intfront;intrear;}CircularQueue;voidinitializeQueue(CircularQueue*cq){cq->front=-1;cq->rear=-1;}intisEmpty(CircularQueu......