单调栈 单调队列

news/2024/10/7 21:26:55/文章来源:https://www.cnblogs.com/Domi2011/p/18450652

单调栈 & 单调队列

单调栈

引入

单调栈是什么?顾名思义,单调栈即满足单调性的栈结构,与单调队列相比,其只在一端进行进出。

过程

插入

将一个元素插入单调栈时,为维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性,并且使弹出的元素最少

伪代码

insert x
while !sta.empty() && sta.top()<xsta.pop()
sta.push(x)

单调栈例题

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,a[3000005],b[3000005];
stack <int> s;
int main()
{cin >> n;for(int i=1;i<=n;i++) cin >> a[i];for(int i=n;i>=1;i--){while(!s.empty() && a[s.top()] <= a[i]) {s.pop();//弹出栈顶比当前数小的}if(!s.empty()){b[i] = s.top();   }else{b[i] = 0;}s.push(i);}for(int i = 1;i <= n;i++){cout << b[i] << " ";}return 0;
}

定义也是直接抄OI Wiki

单调队列

引入

首先我们要看一道经典例题,滑动窗口

最暴力的想法很简单,对于每一段 i~i+k-1 的序列,逐个比较来找出最大值(和最小值),时间复杂度约为 O(n * k)。

很显然,这其中进行了大量重复工作,除了开头 k-1 个和结尾 k-1 个数之外,每个数都进行了 k 次比较,而题中 100% 的数据为 n <= 1000000,当 k 稍大的情况下,显然会 TLE。

这时所用到的就是单调队列了。

定义

顾名思义,单调队列的重点分为「单调」和「队列」。

单调 指的是元素的规律递增(或递减)。
队列 指的是元素只能从队头和队尾进行操作。

例题分析

没错,它在这里

代码奉上

//1、维护队首(就是如果你已经是当前的m个之前那你就可以被删了,head++)
//2、在队尾插入(每插入一个就要从队尾开始往前去除冗杂状态)
#include<bits/stdc++.h>
using namespace std;
int n,m;
int q1[1000001],q2[1000001];
int a[1000001];
int min_deque()
{int h = 1,t = 0;for(int i = 1;i <= n;i++){while(h <= t && q1[h] <= i - m) h++;while(h <= t && a[i] < a[q1[t]]) t--;q1[++t] = i;if(i >= m ) cout << a[q1[h]] << " ";}  cout << "\n";return 0;
}
int max_deque()
{int h = 1,t = 0;for(int i = 1;i <= n;i++){while(h <= t && q2[h] <= i - m) h++;while(h <=t && a[i] > a[q2[t]]) t--;q2[++t] = i;if(i >= m) cout << a[q2[h]] << " ";}return 0;
}
int main()
{cin >> n >> m;for(int i = 1;i <= n;i++) cin >> a[i];min_deque();max_deque();return 0;
}

完结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809617.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

期末考试复习宝典P19题7:特征图大小的计算(当计算得到小数时)

https://blog.csdn.net/qfqf123456/article/details/112389559#:~:text=本文介绍了如何计算卷 题目:输入图片大小为200乘200,依次经过一层卷积(kernel size 5乘5, padding 1,stride 2),pooling(kernel size 3乘3, padding 0,stride 1),又一层卷积(kernel size 3乘3, …

IDEA如何快速定位到当前打开文件所在的目录

前言 我们在使用IDEA开发时,经常需要知道当前打开的文件是在哪个目录,这个可以在上方看到具体的目录。 但是,当我们需要知道这个目录下有哪些文件或者想要复制当前文件的时候,就需要快速定位当前文件的目录了。 那么,我们应该如何操作呢? 如何操作定位当前打开文件目录 首…

Vulnhub 靶机 THE PLANETS: EARTH

0x01信息收集 1.1、nmap扫描 IP段扫描,确定靶机地址 平扫描 nmap 192.168.1.0/24扫描结果(部分) Nmap scan report for earth.local (192.168.1.129) Host is up (0.0015s latency). Not shown: 983 filtered tcp ports (no-response), 14 filtered tcp ports (admin-prohib…

基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云监控告警平台(附配置告警至QQ、钉钉)

目录一、机器规划二、部署安装 node-exporter、prometheus、Grafana、kube-state-metrics1、创建 monitor-sa 命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据3、k8s 集群中部署 prometheus3.1、创建一个 sa 账号3.2、将 sa 账号 m…

2024.10.7 鲜花

【UNR #3】百鸽笼【UNR #3】百鸽笼花の塔 君が持ってきた漫画 くれた知らない名前のお花 今日はまだ来ないかな? 初めての感情知ってしまった 窓に飾った絵画をなぞってひとりで宇宙を旅して それだけでいいはずだったのに 君の手を握ってしまったら 孤独を知らないこの街には…

基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云平台系统(附配置告警至QQ、钉钉)

目录一、机器规划二、部署安装 node-exporter、prometheus、Grafana、kube-state-metrics1、创建 monitor-sa 命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据3、k8s 集群中部署 prometheus3.1、创建一个 sa 账号3.2、将 sa 账号 m…

软件工程第二次结对作业

软件工程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13281作业目标 基于第一次结对作业项目程序的实现学号 102201127合作伙伴 102201129项目分工: 102201129周鑫: 前端开发: 设计和实现用户界面。 确保界面响…

20241007

sequence 我们会发现,我们每次删的一定是长度最短的那个,所以我们可以最开始按照长的排一下序,然后用线段树维护每一个区间中还有几个数,每次加上答案后在两个端点打上标记即可 #include <bits/stdc++.h> #define _1 (__int128)1using namespace std; using ll = long lo…

软件工程week2课程作业|“物品复活“软件开发

“物品复活”软件开发 作业要求 大学生经常有些物品觉得扔掉可惜,不处理又觉得浪费自己的地方。请你编写一个物品“复活”软件 该程序允许添加物品的信息(物品名称,物品描述,联系人信息),删除物品的信息,显示物品列表,也允许查找物品的信息 你实现的程序可以采用命令行…

[42] (多校联训) A层冲刺NOIP2024模拟赛03

今天的乐子今天的乐子2 昨天晚上做梦 梦见自己被关进戒网瘾学校 里面的老师全和疯子一样 然后我和这帮疯子老师比疯 疯子老师发现他们没我疯 所以就把我放了今天的乐子3 lhx 罗曼蒂克的辟谷A.五彩斑斓 赛时的想法 \(n^4\) 的做法,设 \(f_{i,j,k,l}\) 表示以 \((i,j)\) 为左上角…

Metasploit渗透测试框架学习(一)基本使用教程

1.Metasploit框架结构 1.1总览基础库文件Rex为最底层,实现网络套接字、网络应用协议、客户端服务端交互、数据库支持等 framework-core实现与上层模块交互的接口 framework-base对framework-core的扩展封装,用于提供各种接口供用户调用基于framework-base实现的六大模块Explo…

统计学(十三)——相关分析

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 相关分析是用于研究多个变量之间相互关系的统计方法,最早由英国统计学家卡尔皮尔逊(Karl Pearson)于1896年提出。皮尔逊通过对变量间线性关系的深入研究,…