总结:单调栈

\(\texttt{单调栈}\)

\(\texttt{单调栈学习笔记}\)

今天学习的是 数据结构:单调栈

(n 久之前了……)

\(\texttt{数据结构讲解}\)

\(\texttt{单调栈的类型}\)

  1. 单调递增栈

  2. 单调递减栈

  • 单调递增栈:指的是一个栈中的元素都是单调递增的。
  • 单调递减栈:指的是一个栈中的元素都是单调递减的。

(注:上面说的都是从栈顶到栈底的顺序来单调递增或者是递减的)

\(\texttt{图片实例}\)
  • 单调递增栈
  • 单调递减栈

\(\texttt{例题讲解}\)

\(\texttt{B3666 (单调栈模板题目)}\)

这道题就是单调栈的模板题目。


题目描述

给定一个数列 \(a\),初始为空。有 \(n\) 次操作,每次在 \(a\) 的末尾添加一个正整数 \(x\)

每次操作结束后,请你找到当前 \(a\) 所有的后缀最大值的下标(下标从 1 开始)。一个下标 \(i\) 是当前 \(a\) 的后缀最大值下标当且仅当:对于所有的 \(i < j \leq |a|\),都有 \(a_i > a_j\),其中 \(|a|\) 表示当前 \(a\) 的元素个数。

为了避免输出过大,请你每次操作结束后都输出一个整数,表示当前数列所有后缀最大值的下标的按位异或和。


这道题就是标准的单调栈模板题目了,由于是求最大值,所以我们使用单调递增栈,直接模拟即可。

\(\texttt{代码}\)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int N = 1e6 + 5;
int n, tot;
ULL st[N], a[N];
int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) cin >> a[i];int ans = 0;for (int i = 1; i <= n; ++i) {while (tot > 0 && a[st[tot]] <= a[i]) tot--, ans ^= st[tot + 1];ans ^= i;st[++tot] = i;cout << ans << '\n';}return 0;
}

\(\texttt{U514895 单调栈-左侧 / 右侧第一个较小值(不重复)}\)

\(\texttt{思路}\)

非常简单,思路上面都讲过了,所以我们可以直接套模板即可,但是右边我们需要注意一点,我的方法是反过来跑一边,但是 c tearcher 说 DP 不能反着跑,所以还可以在每一个元素被 pop 出去时直接将其记录下来,其实都是一样的答案。

左侧

#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int N = 1e6 + 5;
int n, a[N], tot, st[N], l[N];
signed main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) cin >> a[i];for (int i = 1; i <= n; ++i) {while (tot > 0 && a[st[tot]] >= a[i]) tot--;l[i] = st[tot];st[++tot] = i;}if (n <= 1000) for (int i = 1; i <= n; ++i) cout << (l[i] == 0 ? -1 : l[i]) << ' ';else {int ans = 0;for (int i = 2; i <= n; ++i) ans ^= (l[i] == 0 ? -1 : l[i]);cout << ans << endl;}return 0;
}

右侧

#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int N = 1e6 + 5;
int n, a[N], tot, st[N], l[N];
signed main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) cin >> a[i];for (int i = n; i >= 1; --i) {while (tot > 0 && a[st[tot]] >= a[i]) tot--;l[i] = st[tot];st[++tot] = i;}if (n <= 1000) for (int i = 1; i <= n; ++i) cout << (l[i] == 0 ? -1 : l[i]) << ' ';else {int ans = 0;for (int i = 2; i <= n; ++i) ans ^= (l[i] == 0 ? -1 : l[i]);cout << ans << endl;}return 0;
}

\(\texttt{U514939 单调栈-左右两侧第一小于等于值(存在重复情况)}\)

\(\texttt{U514895 单调栈-左右两侧第一小于值(存在重复情况)}\)

\(\texttt{思路}\)

其实都是和上面一样的,我们直接就可以把两个代码结合起来,不过需要注意的一点是,这里存在了重复现象,但是也没有关系,我们把上面两个的符号修改即可。

\(\texttt{代码}\)

小于等于

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int N = 5e5 + 6;
int n, a[N], l[N], r[N], st[N], tot = 0; 
int main() {cin >> n;for (int i = 1; i <= n; ++i) cin >> a[i];for (int i = 1; i <= n; ++i) {while (tot > 0 && a[st[tot]] > a[i]) tot--;l[i] = st[tot];st[++tot] = i;}tot = 0;for (int i = n; i >= 1; --i) {while (tot > 0 && a[st[tot]] > a[i]) tot--;r[i] = st[tot];st[++tot] = i;}for (int i = 1; i <= n; ++i) {cout << (l[i] == 0 ? -1 : l[i]) << ' ' << (r[i] == 0 ? -1 : r[i]) << '\n';}return 0;
}

小于

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int N = 5e5 + 6;
int n, a[N], l[N], r[N], st[N], tot = 0; 
int main() {cin >> n;for (int i = 1; i <= n; ++i) cin >> a[i];for (int i = 1; i <= n; ++i) {while (tot > 0 && a[st[tot]] >= a[i]) tot--;l[i] = st[tot];st[++tot] = i;}tot = 0;for (int i = n; i >= 1; --i) {while (tot > 0 && a[st[tot]] >= a[i]) tot--;r[i] = st[tot];st[++tot] = i;}for (int i = 1; i <= n; ++i) {cout << (l[i] == 0 ? -1 : l[i]) << ' ' << (r[i] == 0 ? -1 : r[i]) << '\n';}return 0;
}

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

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

相关文章

基于ThreeJs的大屏3D地图(二)——气泡图、渐变柱体与热力图

前提 上一篇文章中我们完成了地图区块模型的渲染,在此基础之上本篇来讲解气泡图、3D柱形图以及3D热力图的实现方式。 首先,为了更好的关注点分离及与地图渲染模块的解耦,我们可以把所有类型的可视化元素抽象出一个图层基类BaseLayer: /*** 图层基类*/ abstract class BaseL…

揭露GPT幻觉只需一个提示

把像GPT这样的超大语言模型投入真实世界应用时,最大挑战之一就是经常说的幻觉。这就是说这些模型会开始编造一些根本不对的事实。最麻烦的地方是你可能根本不会发现,因为这些文字放在上下文里听起来很自然。 这对那些需要事实核查,或者某种形式的事后验证才能信任LLM回答的关…

如何使用ChatGPT画流程图

如何使用ChatGPT画流程图 MermaidMermaid 是一款基于 JavaScript 的图表绘制工具,使用 Markdown 风格的文本定义和渲染器来创建和修改复杂图表。Mermaid 的主要目的是帮助文档跟上开发的步伐。使用示例将ChatGPT回复的代码粘贴到下面的网站上 https://mermaid.live/

成都控制板定制:常见的MAX485芯片型号和后缀的含义

我处承接提供优质的单片机系统开发、电路板PCB设计、控制器研发控制箱定制、电子产品、硬件开发、工控测控传感自动化PLC系统设计、仪器定制仪表订做、信号采集器研发、物联网、软件EXE编程、安卓APP等开发定制加工优质服务(www点yonko-tech点com),在项目时会经常用到485通信…

震撼揭秘:LLM幻觉如何颠覆你的认知!

LLM幻觉 把幻觉理解为训练流水线中的一种涌现认知效应 Prashal RuchirangaRobina Weermeijer 在 Unsplash 上的照片介绍 在一个名为《深入剖析像ChatGPT这样的LLM》的YouTube视频里,特斯拉前AI资深总监Andrej Karpathy探讨了大型语言模型(LLM)的心理现象,把它看作是训练流水…

Windows 10 Hyper-V 安装不了 统信UOS Server 解决方案

如果一直停留在上面的页面,删除虚拟机,记得创建虚拟机,不要选择2代CPU。

Windows下DeepSeek R1简单搭建

目录安装 Ollama简介安装运行模型选择嵌入模型(Embedding)安装和使用Cherry Studio配置Cherry Studio配置使用本地模型知识库配置 安装 Ollama 简介 Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 提供了一个简…

学习进度记录贴

本文主要记录作者的各个学习记录🐫学习进度记录帖本贴开立初衷是为了督促作者好好学习,用记录的方式收获一点正反馈。作者目前大三下半学期,由于对考研上不了岸z的担忧,所以想边实习边考研。虽然这是很多人都不建议走的一条路,但是只有这样才能够缓解我的焦虑,让我不必在…

SSL/TLS握手阶段解析

众所周知SSL/TLS是HTTPS的基石,我觉得对经常都在使用的网络需要有进一步的了解。 HTTPS协议全称(Hypertext Transfer Protocol Secure),它与HTTP协议最大的不同就在于更安全。 HTTP是明文协议,所有内容默认都没有经过加密,当然也可以由开发人员将客户端和服务端要发送的内…

CICD+K8s项目实战讲解

CICD 流水先实战,使用git+Jenkins(git+mvn+docker)+ harbor + k8s 1.环境说明

我的公众号接入了DeepSeek-R1模型,成为了一个会深度思考的强大.NET AI智能体!

前言 前不久腾讯元器宣布接入满血版 Deepseek R1 模型,模型免费使用且不限量,为智能体开发提供更多样化的模型选择,带来更丰富的智能体功能和玩法。 今天咱们一起来把我公众号的.NET AI智能体模型从腾讯混元大模型-turbo(32k)切换为DeepSeek-R1(32k),使其拥有深度思考功能变…

图周围添加阴影更逼真 filter:drop-shadow(0 2px 14.7px rgba(0, 0, 0, .08));

filter:drop-shadow(0 2px 14.7px rgba(0, 0, 0, .08));在CSS中,filter 属性可以用来应用图形效果,如模糊、阴影、颜色变换等。drop-shadow 则是 filter 属性中的一种效果,用于给元素添加阴影效果。 语法filter: drop-shadow(offset-x offset-y blur-radius color);offset-x…