单调队列

【C++】单调队列 详解 今天我们来讲一下单调队列与栈。 这两种数据结构虽然没有在c++的stl中有直接的实现,但是在做题过程中,很容易有单调队列(栈)的使用,尤其是在一些比较难的题目中。 目录单调队列1.1 单调队列介绍1.2 单调队列的应用1.2.1 滑动窗口最大值1.2.1.1 题目描述1.2.1.2 结题思路方法一(优先队列)方法二 (单调队列)1.3 单调队列的模拟实现1.4 其他例题 单调队列 1.1 单调队列介绍 单调队列 是 队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队 阅读详情

参考博客:2019年4月11日单调队列讲义大佬讲的非常好,如果没看懂,B站上搜《大雪菜》,讲的非常的屌

题目:逛画展

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 1e6+10;
int a[maxn], vis[2005];
deque<int>q;
int main(){
    int n, m;
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i = 1; i <= n; i++){
        cin>>a[i];
    }
    memset(vis, 0, sizeof(vis));
    int cn = 0, x, y, ans = 1e9;
    for(int i = 1; i <= n; i++){
        if(!vis[a[i]])cn++;//判断之前出没出现过
        q.push_back(i);
        vis[a[i]]++;//统计出现的个数
        while(vis[a[q.front()]] >= 2){//如果出现的次数大于2就弹出队首
                vis[a[q.front()]]--;//出现的次数减1
                q.pop_front();
        }
        while(cn >= m && q.back() - q.front() +1 < ans){//如果cn大于或者m的时候出现出现不同数的次数一定会是大于等于m的
                //因为当cn == m的时候接着向后移动的时候cn也一定会大于等于m的,因为最坏的情况下是加入一个删除一个
            ans = q.back() - q.front() + 1;
            x = q.back();
            y = q.front();
        }
    }
    cout<<y<<" "<<x<<endl;
return 0;
}

题目:切蛋糕

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5000010;
typedef long long LL;
int a[maxn];
LL sum[maxn];
deque<int>q;
int main()
{
    ios::sync_with_stdio(false);
    int n, m;
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        cin>>a[i];
        sum[i] = sum[i-1] + a[i];//前缀和
    }
    LL MAX = 0;
    for(int i = 1; i <= n; i++)
    {
        while(q.size() && i - q.front() > m)
        {
            q.pop_front();
        }
        while(q.size() && sum[i] <= sum[q.back()])//
        {
            q.pop_back();
        }
        q.push_back(i);
        if(q.size())MAX = max(MAX, sum[i]-sum[q.front()]);
    }
    cout<<MAX<<endl;
    return 0;
}

 

单调队列的应用 dp[i][j]:表示将前i个元素分割成j段的 “最小最大值”(即所有分割方式中,子数组和最大值的最小值)。 阅读详情

相关推荐

详解单调队列算法

在上一篇文章中,我们介绍了「单调栈」这一最常考察的线性数据结构。而今天我们将继续沿着这个思路,介绍另一个与其 “齐名” 的线性数据结构,即「单调队列」。 「单调队列」在「数据结构」题中的分布较为广泛,且常被当作优化「动态规划」的一种重要手段,因此该算法在面试中考察的频率较高,属于必知必会的知识点。

lucius-liu.cn 7923

【单调队列】数据结构之单调队列详解

单调队列详解和习题引入

行码棋 1万+

放弃FFT全频计算!在STM32F407上用DFT单点计算提速50%的优化技巧

本文详细介绍了在STM32F407上通过DFT单点计算实现比FFT快50%的优化技巧,特别适用于生物阻抗分析、振动监测等只需关注单一频点的嵌入式场景。通过预计算相位角、查表法和混合精度计算等策略,显著提升计算效率和内存利用率,同时保持高精度。

weixin_28738397的博客 191

浅谈单调队列

单调队列是指:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。 队列是一种先进先出(FIFO First In First Out)的数据结构,它类似于下面这幅图: 队列的进出方式类似于平时我们排队打饭,来排队的人从队尾进入,打完饭的人从队头弹出。 队列的在程序中储存的方式有很多,OI中最为常用的是使用头指针head和尾指针tail进行存储 头指针指...

月殇 2万+

WSL2 Ubuntu复现FoundationPose项目(docker)

复现一个基于深度学习的物体姿态估计框架FoundationPose项目,使用docker,WSL2

woaidawangwang的博客 1999

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3756

单调队列和单调栈详解

这里是我的blog:有更多算法分享=v= https://endlesslethe.com/monotone-queue-and-stack-tutorial.html 前言 单调栈和单调队列算是栈和队列的高级应用吧,在公司面试中应该是不怎么会出现的(除非算法岗?)。因为原理比较简单,网络上的相关资料反而对于这两个东西说得都不甚清楚,尤其是它们的应用方法。最基本的两本中文算法书“紫书”和“白皮”都

小楼吹彻玉笙寒 6600

【汽车故障诊断2】从标准到实战:解码DTC格式背后的诊断逻辑

本文深入解析汽车诊断故障码(DTC)的格式与逻辑,对比了OBD-II标准(如ISO 15031-6)的5字符格式与UDS协议(ISO 14229-1)下更丰富的3字节格式。文章从国际标准出发,结合实战案例,阐述了DTC如何作为汽车电子系统的“体检报告”,帮助工程师和维修技师精准定位故障,并详细解读了UDS 19服务如何读取和管理DTC状态。

berry的博客 708

单调队列详解

单调队列详解单调队列在曾经我眼中一直是一个很高大上,遥不可及的东西,直到我学会它以后。。。 队列是一种先进先出(FIFO First In First Out)的数据结构,它类似于下面这幅图: 队列的进出方式类似于平时我们排队打饭,来排队的人从队尾进入,打完饭的人从队头弹出。 队列的在程序中储存的方式有很多,OI中最为常用的是使用头指针head和尾指针tail进行存储

ZJL_OIJR的博客 1万+

【kubeEdge】离线部署

根据k8s的这个规则,可以将节点通过 label 的方式进行分组,比如将某几个节点都打上标签为 name=edge,当调度应用到 edge 节点时,会找到 label 为 edge 的所有节点,根据设置的副本数,将应用启动起来,如果设置的副本数超过了设置 edge 标签的节点数,则多出的将会显示 pending 状态,从而无法启动。清除 keadm init 或 keadm join 造成的影响均可使用 keadm reset,这个操作会删除 /etc/kubeedge 下的文件,如有需要请提前备份。

qq_42944740的博客 1716

避开这些坑!晶圆封装中Wire Bonding(引线键合)的5种常见不良与实战调试心得

本文深入探讨晶圆封装中Wire Bonding(引线键合)的5种常见不良现象,包括Wire Offset、BSOB不良、球径/球厚异常、弧度不良和IMC问题。通过实际案例和参数优化方案,帮助工程师提升封装质量和可靠性,特别适用于半导体封装领域的专业人士。

weixin_33672109的博客 523

【算法】单调队列

算法学习笔记之单调队列

Eristic0618的博客 1653

Exploring Automated Distractor Generation for Math Multiple-choice Questions via Large Language Mode

多项选择题(MCQ)在几乎所有级别的教育中都无处不在,因为它们易于管理、评分,并且是评估和实践中可靠的格式。MCQ最重要的方面之一是干扰因素,即旨在针对真实学生常见错误或误解的不正确选项。迄今为止,对于教师和学习内容设计师来说,制作高质量的干扰物的任务在很大程度上仍然是一个劳动和时间密集型的过程,其可扩展性有限。在这项工作中,我们研究了数学MCQ领域的自动干扰物生成任务,并探索了从上下文学习到微调的各种基于大型语言模型(LLM)的方法。

c_cpp_csharp的专栏 317

DP单调队列优化

内,那么,通过下图可以发现,其实整个DP的过程类似单调队列滑动窗口。,所以前区间的最小值一定能维护到,方案可行。所以,我们可以考虑用单调队列来优化枚举。由于一段的连续长度不能超过。这个点已经加入单调队列了,不必再加)。是定值,不用枚举,而对于剩下的。可以考虑用单调队列维护最大值。那么,对于当前点的最大值就是。加入单调队列中,维护最大值(的循环,优化后时间复杂度为。,所以答案通过队头就可以。,单调队列循环次数一共是。,先按照题目计算出价值。,然后放入单调队列中。由于普通思想需要枚举。

STY_fish_2012的博客 814

OpenClaw 多代理协同工作模式配置指南

OpenClaw 采用。

形上得其象,形下合于数;阴阳自济,玄理自明。 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

单调队列的使用

单调队列其实就是一个队列,只是使用了一点巧妙的方法使得队列中的元素全都是单调递增(或单调递减)的单挑队列主要解决以下问题:滑动窗口在滑动时,r++代表右侧数字进入串口,l++代表左侧数字出窗口这个过程中,想随时得到当前滑动窗口的。

2301_80610560的博客 955

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

浅说单调队列

单调队列(Monotonic Queue)是一种特殊的,它是一个队列,并且队列中的元素具有单调性。这种单调性可以是单调递增或者单调递减或呈现出其他的样子。例如,在一个单调递减的队列中,队首元素是队列中最大的元素,并且随着元素的入队和出队操作,队列始终保持递减的性质。

CylMK的博客 1615

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

单调队列——详解

顾名思义,单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增(或递减)。「队列」指的是元素只能从队头和队尾进行操作。Ps. 单调队列中的 "队列" 与正常的队列有一定的区别,稍后会提到。

w_w_wwwww的博客 1005

学习记录#1——单调队列

单调队列的学习记录和做题笔记

2303_80076499的博客 1748

数据结构——单调队列

这篇博客我们来讨论一下单调队列的问题,其实和之前学的单调栈都是一种上通过改变操作来解决问题的一种我们先来回忆一下的内容,这样方便将其和做区分1.单调栈是一种,只能在栈顶进行插入和删除操作。2.单调栈的特点是栈中的元素按照,常用的有单调递增和单调递减。3.在插入新元素时,如果新元素破坏了当前的单调性,则从,直到满足单调性 要求。这样可以保证栈中的元素保持单调性。4.单调栈的典型应用是在单调队列:1.单调队列是一个,支持在队列两端进行插入和删除操作。

2301_80475191的博客 1292

进阶数据结构——单调队列

单调队列的核心是利用单调性快速获取区间最值,适合解决滑动窗口类问题。高阶问题的突破口通常在于维度转换(如二维转一维)或逻辑等价变形。

ycs66的博客 1642

【数据结构】单调队列(什么是单调队列,核心代码,什么情况适用单调队列)

顾名思义:单调:单调递增,单调递减。队列:先进先出,队首是q.front(),队尾是q.back()。单调队列通常用双端队列(deque)实现,因为需要在队首删除‘超出范围的元素’,在队中删除‘破坏单调性的元素’,在队尾加入新元素 —— 普通队列(queue)只能在队首删、队尾加,无法满足中间删除的需求”。这样能解释 “为什么用 deque 而不用普通 queue”,避免后续写代码时混淆数据结构选择。当向队列中添加新元素时,会移除队列中所有比新元素更不符合单调性的元素(更大/更小)队首。

2301_80798130的博客 996
上一篇: LCM from 1 to n LightOJ - 1289
下一篇: Largest Allowed Area(二分+二位前缀和)
Re:fused
博客等级 码龄9年 474粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值