什么是单调栈

顾名思义,单调栈即满足单调性的栈结构。这里的单调递增或递减是指的从栈顶到栈底单调递增或递减。既然是栈,就满足后进先出的特点。与之相对应的是单调队列。

单调栈的实现

插入

在当前元素插入栈里时和栈顶元素做对比,根据实际情况选择是否插入

使用

我们可以记录单调栈实现过程中的一些中间值等等信息

举例

现在有一组数10,3,7,4,12。从左到右依次入栈,则如果栈为空入栈元素值小于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素小的元素全部出栈。单调递减的栈反之。

① 10入栈时,栈为空,直接入栈,栈内元素为10。

② 3入栈时,栈顶元素10比3大,则入栈,栈内元素为10,3

③ 7入栈时,栈顶元素3比7小,则栈顶元素出栈,此时栈顶元素为10,比7大,则7入栈,栈内元素为10,7。

④ 4入栈时,栈顶元素7比4大,则入栈,栈内元素为10,7,4。

⑤ 12入栈时,栈顶元素4比12小,4出栈,此时栈顶元素为7,仍比12小,栈顶元素7继续出栈,此时栈顶元素为10,仍比12小,10出栈,此时栈为空,12入栈,栈内元素为12。

应用

第一种应用

给一个数列,然后问你这个数列每一个元素右边(或者左边)第一个大于(或小于)该元素的位置

第二种应用

给一个数列,寻找其中的一个子序列满足子序列的最小值和序列的长度的乘积最大

第三种应用

给一个数列,寻找一个子序列的最小值和子序列的所有元素和的积最大

代码实现

以洛谷P5788为例

#include<bits/stdc++.h>
using namespace std;const int N = 3e6+10;
int a[N];
int f[N],n;
stack<int> S;int main()
{scanf("%d",&n);for(int i = 1;i <= n; ++i) {scanf("%d",&a[i]);}for(int i = 1;i <= n; ++i) {while(S.size() && a[i] > a[S.top()]) {f[S.top()] = i;S.pop();}S.push(i);}for(int i = 1;i <= n; ++i) {printf("%d%c",f[i],i==n?'\n':' ');}return 0;
}

附上练习题

题目连接 题目名
https://www.luogu.com.cn/problem/P5788 P5788 【模板】单调栈
http://poj.org/problem?id=3250 Bad Hair Day
http://120.78.128.11/Problem.jsp?pid=2128 第九集,离间计
http://poj.org/problem?id=2559 Largest Rectangle in a Histogram
http://poj.org/problem?id=3494 Largest Submatrix of All 1’s
http://poj.org/problem?id=2796 Feel Good

视频链接:https://www.bilibili.com/video/BV1KX4y1w7um

2021年SWPUACM暑假集训day5单调栈算法相关推荐

  1. 2021年SWPUACM暑假集训day1二分算法

    二分算法是什么 二分搜索是一种时间复杂为log2nlog_2nlog2​n的算法,可以用于单调函数求根和单调序列查询的有效算法,即使在数列长度在很大的情况下也能很快对其查询,在此同时二分算法也是一种思 ...

  2. 2021年SWPUACM暑假集训day4KMP算法

    什么是KMP算法 KMP算法(也叫看猫片算法(bushi)是Knuth.Pratt 和 Morris 在 1977 年共同发布一个在线性时间(O(n+m))字符串查找或匹配算法,常用于在一个文本串 S ...

  3. 2021年SWPUACM暑假集训day3最小生成树算法

    前言 视频链接 视频连接:https://www.bilibili.com/video/BV1wV411s7Pe 练习题单 SWPUOJ题单:http://acm.mangata.ltd/traini ...

  4. 2021年SWPUACM暑假集训day2并查集算法

    什么是并查集 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 合并 及 查询 问题. 它支持两种操作: 1.查找(find):确定某个元素处于哪个子集 2.合并(merge):将两个子集 ...

  5. 【Nowcoder】2021牛客暑假集训营(第七场): xay loves trees 双指针 + 线段树 + 尺取

    传送门 题意 给你两个树,求一个最大集合,要求集合内的任意两个点在第一个树上,比如是祖先关系,在第二棵树,不能存在祖先关系 分析 某人吐槽我的题解写的太简单了,然后我觉得...承认错误死不悔改 这道题 ...

  6. 【2021软件创新实验室暑假集训】SpringMVC框架(设计原理、简单使用、源码探究)

    系列文章目录 20级 Java篇 [2021软件创新实验室暑假集训]计算机的起源与大致原理 [2021软件创新实验室暑假集训]Java基础(一) [2021软件创新实验室暑假集训]Java基础(二) ...

  7. 【软件创新实验室2021年暑假集训】Java技术培训——Java前置知识学习

    [软件创新实验室2021年暑假集训]Java技术培训--Java前置知识学习 文章目录 [软件创新实验室2021年暑假集训]Java技术培训--Java前置知识学习 前言 一.了解计算机 1.计算机的 ...

  8. 2021暑假集训总结

    ACM暑期集训就要结束了,有许多感想许多收获,一个多快两个月的训练学到了很多.总体来说,这个暑假对我是一个很有收获的暑假,也是第一次在校集训,效率比在家高很多,也写了自己的板子.不仅仅是算法的学习,在 ...

  9. 2021牛客暑假多校第二场 K题—Stack (链表)

    2021牛客暑假多校第二场 K题-Stack 题意: 一个单调栈,给你第n次操作时里面数据的数量,让你给出里面塞入的会是哪些数字. 主要思想:链表模拟 (代码里面有注释) (题解一开始说的是拓扑,后来 ...

最新文章

  1. IOS UITableView详解一数据展示 页面简单实现
  2. idea自动捕获_Smilefie:如何通过检测微笑来自动捕获自拍
  3. 记本阶段建站心得,是走无限做垃圾站之路还是真正的开发之路
  4. 关于bootstrap的一些想法
  5. 可能是全网首个前端源码共读活动,诚邀加入学习
  6. java字符流写入式乱码_字节流乱码与字符流乱码
  7. 十万亿级OLAP引擎解读-AnalyticDB如何支撑数据银行超大规模低成本实时分析
  8. puppeteer执行js_使用Node.js和Puppeteer与表单和网页进行交互– 2
  9. Idea java 程序打jar包(maven)
  10. 开发者必备Mysql命令
  11. java list 某个重复列_Java 开发的编程噩梦,这些坑你没踩过算我输
  12. Python五角星绘制
  13. Win11如何重置电脑 Win11重置电脑教程
  14. 使用Kolla镜像Openstack多节点快速搭建部署
  15. 修改内存卡里linux系统文件怎么恢复,EMMC转SD卡做成内存卡恢复数据教程
  16. 小米路由pro php,家庭实测 | 荣耀路由Pro2 可以吊打小米路由器吗?
  17. 政治正确的睡前故事(4则)【搬运】【破事水】
  18. 用pygame写像素游戏地图编辑器
  19. window8 添加美式键盘
  20. CodeForces1214B

热门文章

  1. test软件工程第三次作业
  2. 如何在乌版图系统添加拼音输入法!
  3. 20181211作业
  4. centos7下kubernetes(1。kubernetes---start)
  5. 如何高效判断java数组是否包含某个值
  6. [haoi2011]向量
  7. 构建自己的PHP框架(邮件发送)
  8. 使用ERStudio创建数据表与ER图
  9. Latex中关于参考文献的一些经验
  10. SEO工具,站长必备