单调栈练习

最大矩形面积

如果栈为空,或者新的元素是大于栈顶元素的,那么新来的元素不会破坏栈的单调性,那么就把这个柱子入栈。

特别注意:这里的s.empty()和s.top().height < a不能调换顺序,包括后面的判断也要先判断栈是否为空。c++中的&&和||是短路与和短路或,但一个栈是空的时候,我们再去调用这个栈的栈顶,会报错,所以我们先去判断栈时候为空,如果是空的话,表达式s.empty() || s.top().height < a 已经为true了,那么这个表达式就被||短路了,也就是s.top().height < a就不会被执行了,也就是top一定不会去作用到一个空栈上。包括下面的!s.empty() && s.top().height >= a的表达式不能调换位置

这里的话我们去判断,如果栈不为空的时候并且新来的元素小于栈顶元素,那么新来的元素就破坏了栈的单调递增

那么我们就需要把这个栈的栈顶出栈,直到这个数进栈后不会破坏这个栈的单调递增。

我们用temp_height来存储这个栈顶的元素的高度,此时搞定了矩阵的高度。

至于矩阵的宽度,我们想一下,此时加进去的a比栈顶元素矮,那么a这个元素一定是栈顶元素右侧第一个小于a的元素,此时我们把栈顶元素出栈,此时的栈顶元素就是左侧第一个小于的元素

所以可以得出代码

#include<bits/stdc++.h>
using namespace std;
struct n {int height, index;
}temp;
stack<n> s;
int num, a, length, temp_height, temp_w;
long long ans;  
int main(){while (cin >> num && num) {for (int i = 1; i <= num; i++) {scanf_s("%d", &a);if (s.empty() || s.top().height < a) {temp.height = a;temp.index = i;s.push(temp);}else if (!s.empty() && s.top().height >= a) {while (!s.empty() && s.top().height >= a) {temp_height = s.top().height;s.pop();if (s.empty()) {length = i - 1;}else {length = i - s.top().index - 1;}ans = max(ans, (long long)length * temp_height);}temp.height = a;temp.index = i;s.push(temp);}if (!s.empty() && i == num) {while (!s.empty()) {temp_height = s.top().height;temp_w = s.top().index;if (s.size() == 1) {length = temp_w;s.pop();}else {s.pop();length = temp_w - s.top().index;}ans = max(ans, (long long)length * temp_height);}}}printf("%lld\n", ans);num = a = length = temp_height = temp_w = 0;ans = 0;while (!s.empty()) s.pop();}return 0;
}

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

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

相关文章

iOS 创建pch文件

1.参考链接&#xff08;xcode8添加方法&#xff0c;之前的跟这个差不多&#xff09;&#xff1a; 参考链接 2.自我总结&#xff1a; &#xff08;1&#xff09;创建pch文件: 注意点&#xff1a;1&#xff09;注意选中所有的targets&#xff08;看图明义&#xff09; 2&…

基于java 自定义注解Annotation设计简单ORM框架——进阶篇

目录 引言实例新建两个注解标注实体类拼接sql语句 总结 引言 一般Java规范编程&#xff08;只是一种习惯&#xff0c;而不是强制&#xff09;中&#xff0c;变量的命名方式一般采用驼峰式命名。比如userName&#xff0c;userImage。但是在数据库中一般不会采用驼峰式&#xff…

如何在 Ubuntu 12.10 上使用 Python 创建 Nagios 插件

介绍 Python 是一种在 Linux 上默认可用的流行命令处理器。 我们之前已经介绍过如何在 Ubuntu 12.10 x64 上安装 Nagios 监控服务器。 这一次&#xff0c;我们将扩展这个想法&#xff0c;使用 Python 创建 Nagios 插件。 这些插件将在客户 VPS 上运行&#xff0c;并通过 NR…

利用KMeans进行遥感NDWI进行聚类分割

&#xff08;1&#xff09;解释 KMeans算法是一种非监督式的聚类算法&#xff0c;于1967年由J. MacQueen提出&#xff0c;聚类的依靠是欧式距离&#xff0c;其核心思想就是将样本划分为几个类别&#xff0c;类里面的数据与类中心的距离最小。类的标签采用类里面样本的均值。 这…

Android Compose四: 常用的组件 Text

Text Composable fun Text(text: String, //用于设置显示文本modifier: Modifier Modifier, //设置形状大小点击事件等color: Color Color.Unspecified, //fontSize: TextUnit TextUnit.Unspecified,fontStyle: FontStyle? null,fontWeight: FontW…

动态规划-两个数组的dp问题3

文章目录 1. 两个字符串的最小ASCII删除和&#xff08;712&#xff09;2. 最长重复子数组&#xff08;718&#xff09; 1. 两个字符串的最小ASCII删除和&#xff08;712&#xff09; 题目描述&#xff1a; 状态表示&#xff1a; 根据经验以及题目要求&#xff0c;建立二维数…

数据结构与算法学习笔记三---栈和队列

目录 前言 一、栈 1.栈的表示和实现 1.栈的顺序存储表示和实现 1.C语言实现 2.C实现 2.栈的链式存储表示和实现 1.C语言实现 2.C实现 2.栈的应用 1.数制转换 二、队列 1.栈队列的表示和实现 1.顺序队列的表示和实现 2.链队列的表示和实现 2.循环队列 前言 这篇文…

JVM 自定义类加载器

文章目录 1. 为什么要自定义类加载器1.1 隔离加载类1.2 修改类加载的方式1.3 扩展加载源1.4 防止源码泄漏 2. 自定义类加载器应用场景有哪些3. 两种实现方式 自定义类加载器是Java中的一个高级特性&#xff0c;允许您在运行时动态加载类。通过自定义类加载器&#xff0c;您可以…

postman 使用教程

1. get 请求 &#xff1f;号后为 get 请求的参数 参数之间用符号"&" 分隔。 假设url 为&#xff1a;http://10.71.7.101/cgi-bin/gw-config.cgi?methodgetway_param&t1715658871647 复制进来到postman的地址栏 后 &#xff1f;后面的参数会自动添加到参…

JS中的宏任务和微任务

JavaScript 引擎是建立在一个事件循环系统之上的&#xff0c;它实时监控事件队列&#xff0c;如果有事件就执行&#xff0c;如果没有事件就等待。事件系统是一个典型的生产消费模式&#xff0c;生产者发出事件&#xff0c;接收者监听事件&#xff0c;在UI 开发中是常见的一个设…

OFDM802.11a的FPGA实现(十五)短训练序列:STS(含Matlab和verilog代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 1.前言 在之前已经完成了data域数据的处理&#xff0c;在构建整个802.11a OFDM数据帧的时候&#xff0c;还剩下前导码和signal域的数据帧&#xff0c;这两部分的内容。 PLCP的前导部分…

【MySQL】Mysql——卸载文档(windows版本)

MySQL卸载文档-Windows版 1. 停止MySQL服务 winR 打开运行&#xff0c;输入 services.msc 点击 “确定” 调出系统服务。 停止Mysql服务 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 4. 删除MySQL数据目录 数…