首页 > 其他分享 >单调栈 and 单调队列学习笔记

单调栈 and 单调队列学习笔记

时间:2024-04-06 23:34:53浏览次数:26  
标签:下标 队列 递增 踢出去 笔记 维护 单调

单调栈 and 单调队列学习笔记

本文均以维护单调递增的栈/队列举例。

本篇代码合集

以后在写动态规划单调队列/单调栈优化的时候,这两个东西会合并。

单调栈

本质上就是模拟。

假设要维护一个单调递增的栈,那么对于一个元素进来了,在栈顶的所有比他小的数我全部都要踢出去,不然就不满足单调性。然后把这个数加到栈里面去。

P5788 【模板】单调栈

这里维护的是下标,因为数比较大。不能进行标记。

维护一个单调递增栈,从后往前枚举,每次一个数进来就把小于等于他的数给踢出去,(由于要求第一个大于他的数,当前的位置 \(i\) 是相对于 \([1,i]\) 间的数更近的,相同的情况下 \(i\) 更优)。栈顶就是第一个比他大的数的下标了。

所以,在这个栈里面,数是单调递增的,下标也是单调递增的。故栈顶就是答案。

单调队列

和单调栈的本质基本上是一样的,如果维护一个单调递增的队列,那么一个数加进来的时候就把所有不符合单调性的数全部踢出去。

P1886 滑动窗口 /【模板】单调队列

维护两个单调递增,单调递减队列,如果队列中有数的位置不符合窗口大小,就应该踢出去。

队首就是答案。

标签:下标,队列,递增,踢出去,笔记,维护,单调
From: https://www.cnblogs.com/JuneFailue/p/18118183

相关文章

  • 并查集学习笔记
    并查集学习笔记本质上还是一个复习笔记。考虑这样一个问题:给出\(x,y\),合并\(x,y\)所在集合。给出\(x,y\),查询\(x,y\)是否在同一集合内。我们把集合当成一棵树,两个点有连边就表示他们在同一个集合内。这棵树的根节点就是这个集合的“老大”,也就是这个集合里面的......
  • Docker学习笔记(三)Dockerfile指令详解
    文章目录FROM指定基础镜像RUN执行命令COPY复制文件ADD高级文件复制CMD容器启动命令ENTRYPOINT入口点ENV设置环境变量ARG构建参数VOLUME定义匿名卷EXPOSE声明端口WORKDIR指定工作目录USER指定当前用户HEALTHCHECK健康检查ONBUILD构建触发器LABEL添加元数据......
  • C语言学习笔记--(2)基础语法
    我先写点,我不太擅长写,所以各位有问题可以评论说,我看到一定改一.C语言编程的格式    我们可以先看一个关于C语言的基础实例下面是一个简单的C语言程序,用于计算购买商品的总价,并根据折扣计算最终支付金额。#include<stdio.h>//计算购买商品的总价floatcalculat......
  • 2-SAT 学习笔记
    2-SAT学习笔记P4782【模板】2-SAT2-SAT问题模型:构造bool变量\(x_1,x_2...x_n\),使得满足一些限制一对\(x_1\)和\(x_2\)取值的条件合法。很显然根据Floyd传递闭包可以做到\(O(n^3+m)\),但不太行。有\(O(n+m)\)的做法,发现对于每个条件是要我们选择一种取值(选择就很......
  • [笔记]数位dp例题及详解(更新中)
    数位dp的定义引自洛谷日报#84:求出在给定区间\([L,R]\)内,符合条件\(f(i)\)的数\(i\)的个数。条件\(f(i)\)一般与数的大小无关,而与数的组成有关。由于是按位dp,数的大小对复杂度的影响很小。由于数位dp状态的上下文信息比较多,所以一般用记忆化搜索实现,而非递推。P4999烦人的数......
  • SpringBoot学习笔记
    SpringBoot一、SpringBoot3介绍1.1SpringBoot3简介课程使用SpringBoot版本:3.0.5https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.introducing-spring-boot到目前为止,你已经学习了多种配置Spring程序的方式。......
  • 数据结构:实验四:队列的操作
    一、实验目的领会队列的存储结构特点掌握环形队列中的各种基本运算算法设计熟悉利用队列解决实际问题二、实验要求实现环形队列的定义,头文件命名”SqQueue.h”。利用所定义的环形队列,设计一个算法实现下面问题的求解:问题描述:设有n个人站成一排,从左向右的编号分别为1—n,......
  • 矩阵乘法学习笔记
    可以用来加速dp,解决值域大的问题。$\text{Examples:}$P1962斐波那契数列和某个入门题很像,但值域扩大到了$[1,2^{63})$,当然不能暴力求解,考虑把$f_{n}$和$f_{n-1}$当成向量写在一起:\(\begin{bmatrix}f_{n}\\f_{n-1}\end{bmatrix}\),然后找出使下列等式......
  • c++算法学习笔记 (20) 哈希表
    1.模拟散列表//拉链法#include<bits/stdc++.h>usingnamespacestd;constintN=100003;inth[N];inte[N],ne[N],idx;//存链voidinsert(intx){intk=(x%N+N)%N;//让负数的余数变成正数(若直接加N,则可能溢出)e[idx]=x;ne[idx]......
  • c++算法学习笔记 (21) STL
    1.vector:        变长数组,倍增的思想        size()返回元素个数        empty()返回是否为空        clear()清空        front()/back()元素        push_back()/pop_back()        begin()/end()迭代器 ......