POJ 2559 / HDU 1506 / LightOJ 1083 Largest Rectangle in a Histogram (单调栈)

单调栈(poj -- 2559)   单调栈,顾名思义就是说栈内的元素,按照某种方式排序下,必须是单调的。如果新入栈的元素破坏了单调性,就弹出栈内元素,知道满足单调性。 它可以很方便地求出某个数的左边或者右边第一个比它大或者小的元素,而且总时间复杂度O(N)。       1. 题目大意:链接 给出一个柱形统计图(histogram), 它的每个项目的宽度是1, 高度和具体问题有关。 现在编程求出在这个柱形图中的最大... 阅读详情
Largest Rectangle in a Histogram

Time Limit:  1000MS
Memory Limit: 65536K

Description

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles: 

Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.

Input

The input contains several test cases. Each test case describes a histogram and starts with an integer  n, denoting the number of rectangles it is composed of. You may assume that  1<=n<=100000. Then follow  n integers h1,...,hn, where  0<=hi<=1000000000. These numbers denote the heights of the rectangles of the histogram in left-to-right order. The width of each rectangle is  1. A zero follows the input for the last test case.

Output

For each test case output on a single line the area of the largest rectangle in the specified histogram. Remember that this rectangle must be aligned at the common base line.

Sample Input

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

Sample Output

8
4000

单调栈模板题。

完整代码:
/*POJ: 157ms,1728KB*/
/*HDU: 78ms,1792KB*/
/*LightOJ: 0.112s,2040KB*/

#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100010;

__int64 h[N];
int l[N], r[N];

int main(void)
{
	int n, i, j;
	__int64 ans;
	while (~scanf("%d", &n), n)
	{
		for (i = 1; i <= n; ++i)
			scanf("%I64d", &h[i]);
		for (i = 1; i <= n; ++i)
		{
			j = i;
			while (j > 1 && h[j - 1] >= h[i]) /// 压栈否
				j = l[j - 1]; /// 出栈
			l[i] = j;
		}
		for (i = n; i >= 1; --i)
		{
			j = i;
			while (j < n && h[j + 1] >= h[i]) /// 压栈否
				j = r[j + 1]; /// 出栈
			r[i] = j;
		}
		ans = 0;
		for (i = 1; i <= n; ++i)
			ans = max(ans, h[i] * (r[i] - l[i] + 1));
		printf("%I64d\n", ans);
	}
	return 0;
}

单调栈应用(poj2559最大矩形、最大01子矩阵) 首先介绍一下单调栈(或单调数组)。 单调栈是一个这样的数据结构: 1. 这个数组一定是单调递增(或单调递减)的数组; 2. 可以在末尾添加元素; 3. 在添加元素的过程中,允许弹出尽可能少的元素是数组依旧保持单调性; 例如:原来的单调数组是(1,3,5,7,9),现在希望添加一个元素6。此时我们把末尾的9,7两个元素均删除,插入6在末尾,新的单调数组变成(1,3,5,6)。 可以看出,当我们需要在这个数组末尾添加元素时,需要删除末尾所有大于新元素的元素,再进行添加。 用std::stack实现单调栈的过程 阅读详情

相关推荐

Excel VBA+Adobe Acrobat Pro PDF发票识别全流程(附避坑指南)

本文详细介绍了如何利用Excel VBA与Adobe Acrobat Pro的API接口,构建一套企业级PDF发票智能识别与处理系统。内容涵盖从环境配置、核心文本提取原理、数据解析清洗到工程化脚本设计的全流程,并针对密码区干扰、不征税发票等常见问题提供避坑指南,旨在帮助财务人员和开发者实现高效、精准的财务数据处理自动化。

weixin_29207439的博客 348

Largest Rectangle in a Histogram (连续矩形 够成矩形的最大面积 dp)

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows ...

自渡的博客 467

VSCode连接SAP ABAP开发环境

本文介绍了使用VSCode连接ABAP开发环境的详细步骤。首先通过SICF或SMICM事务码获取ABAP连接地址,然后安装ABAP remote filesystem插件。提供了两种创建连接的方法:通过命令面板逐步配置(输入服务器地址、账号、系统标识等)或直接编辑JSON配置文件。最后通过命令面板选择已创建的连接即可完成连接,连接成功后可在VSCode左侧工作区查看ABAP系统内容进行开发。JSON配置方式更为简便推荐。整个流程帮助开发者摆脱复杂的Eclipse配置,实现快速便捷的ABAP开发环境搭建。

weixin_45293769的博客 2217

poj2559(单调栈的使用)

解题思路:使用单调栈,解题复杂度为O(n).介绍一下思路:其实就是以h[i]为中心,向左,向右搜索有第一个小于h[i]的高度h[j],直到找到这个,并记录j.因为有这个小于在,h[i]就不能继续以h[i]的高度向两边扩散了。 再简单说一下单调栈,他可以维护一组数列呈单调关系,如果出现一个不满足单调关系的数,如5 4 2 1  3,则3就是不满足单调了,这样会把前面的数剔除栈,得到5 4 3,这样...

qq_39861441的博客 406

R语言下载包报错?可能是IE浏览器在搞鬼!手把手教你修复(附CRAN镜像选择指南)

本文深入解析了R语言下载包时常见的网络报错问题,特别是Windows系统中因Internet Explorer代理设置导致的连接失败。文章提供了从重置IE配置、排查防火墙到优化CRAN镜像选择的完整解决方案,并附有详细的配置指南和自动化诊断脚本,帮助用户彻底解决R包安装难题。

weixin_29056781的博客 745

【OpenClaw 故障排查完全指南】

OpenClaw 故障排查指南摘要 本指南针对OpenClaw 2026.2.26版本常见问题提供解决方案,适用于Windows/Linux/macOS平台。 核心问题及修复方案: 飞书插件连接失败:删除冲突插件或重装OpenClaw Ollama认证错误:设置环境变量OLLAMA_API_KEY="ollama-local" 配置警告:可安全忽略的安全扫描提示 端口占用:查找并终止占用18789端口的进程 插件重复加载:清理重复插件目录 快速修复: 提供一键修复PowerShell脚本

weixin_37572294的博客 1万+

[poj2559]Largest Rectangle in a Histogram(多种方法详细介绍)

Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33533 Accepted: 10940 Description A histogram is a polygon composed of a sequence of rectangles aligned at...

Skyed_blue的博客 731

Higress 入门:初探阿里云原生 AI 网关

Higress 是一款由阿里巴巴推出的云原生 API 网关,其内核基于 Istio 和 Envoy。与传统 API 网关不同,它深度聚焦于 AI 场景,支持国内外众多主流模型供应商,如 OpenAI、百度文心一言等,还兼容基于 vllm/ollama 等自建的 DeepSeek 模型,能够满足不同类型企业对 AI 能力集成与管理的需求。Higress 作为一款功能强大的云原生 API 网关,在 AI 时代展现出独特的优势。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1867

Largest Rectangle in a Histogram(dp)

咋一看,个人感觉十分简单,用个二重遍历,求出i之前的最小的矩形的高度以及相对应的连续的矩形的面积,再与自身的矩形比较,也就是找到矩形i左边与右边的比矩形i高的矩形的下标,这里分别用l[i]与r[i]来记录,通过计算公式。(r[i]-l[i]+1)*num[i]来实现对于每个i位置的最大的连续矩形的面积的求解。在寻求其他人的帮助后,发现根本不用两重遍历,通过两次一重遍历即可,大概的意思就是求连续的最大的矩形的面积。最终的话当然是accepted!但是提交之后会超时,

牛牛博士博客 304

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析 5 6

第5关:注销个人信息。

m0_62222486的博客 2128

Airtest进阶使用篇-提高脚本稳定性+批量运行脚本

Airtest进阶篇,主要分享如何提高脚本稳定性+如何批量运行脚本生成测试报告!

程序员小杨哥的博客 2570

Largest Rectangle in a Histogram

题意:让你找到最大的矩形。 ==>那么你就首先从左到右遍历,对于每一个高度向左考虑,找到第一个高度比它小的数,记录位置,向右考虑,找到一个高度比他小的数,记录位置。 然后再整体遍历一边,只需要比对高度*(边长)。 #include <iostream> #include <stdio.h> typedef long long ll; using namespace std; const int maxn = 1e6+10; const int INF = 0x3f3f3

weixin_60789461的博客 299

OpenCV实现物体尺寸的测量

物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸。如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度。

qq_53545309的博客 9159

POJ-2559 单调栈详解 求直方图中最大矩形面积

POJ-2559 Largest Rectangle in a Histogram 单调栈 题意: 给出n个柱子,柱子高度参差不齐,宽度都为1,求柱子能构成最大的矩形的面积 输入: 多个测试样例,第一个数为n,接连输入n个柱子的高度,样例以0结束 输出: 对每个测试样例输出柱子能构成的最大矩形的面积 样例: 7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0 8 4000 题解: 利用一个单调递增的单调栈,单调栈的作用是找到左边或右边第一个大于或小于的元素,求出每个柱子左

imagine7的博客 777

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Largest Rectangle in a Histogram (动态规划+奇思妙想单调栈)求最大矩状图面积

感觉动态规划都是玄妙的很,思维题吧(单调栈思维) 题解:让求最大矩形面积,宽为1,暴力超时 可以发现 当第i-1个比第i个高的时候 比第i-1个高的所有也一定比第i个高 于是可以用到动态规划的思想 令left[i]表示包括i在内比i高的连续序列中最左边一个的编号 right[i]为最右边一个的编号 那么有 当h[left[i]-1]>=h[i]]时 le...

zeng_jun_yv的博客 430

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

POJ 2559 单调栈 Histogram

题目在http://poj.org/problem?id=2559。 这个题目是一个好朋友给我讲的方法,我按照自己的理解,敲出来代码。 所以把算法流程和代码贡献出来,希望和大家共同学习。 题目大意: 给出一个柱形统计图(histogram), 它的每个项目的宽度是1, 高度和具体问题有关。 现在编程求出在这个柱形图中的最大面积的长方形。 例如:  7 2 1 4 5 1 3 3

文西 9464

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

POJ-2559-Largest Rectangle in a Histogram(栈)

题意: 有n个矩形,宽都是1,然后依次给你每个矩形的高。这n个矩形连在一起,现在让你规划一个矩形出来,使得这个矩形的面积最大 思路: 其实这个题一眼看去很难想到用栈来做 那么用栈怎么做呢? 假设现在的数据是 5 1 2 3 4 5 那我们栈内的元素为 1 2 3 4 5 那么area = max (area, s.top() * count); count 是我们...

weixin_33958585的博客 166

HDU1506 Largest Rectangle in a Histogram 直方图中最大的矩形(单调栈/动态规划/笛卡尔树)

Largest Rectangle in a Histogram

xinchu0309的博客 214

Poj 2559 最大矩形面积

Poj 2559 最大矩形面题目来源:https://cn.vjudge.net/problem/POJ-2559#author=0 大意:给定一些长为1,高为x的连续矩形,求最大连续矩形面积 算法:单调栈 题解 1. 开结构体,记录每个矩形的tl(高度),le(最大向左扩展长度) 2. 单调栈,即u.tl>=h时,需弹出栈首的元素 3. 每次pop时,设变量k 此时维护弹出元素

Loi_littlechai的博客 355

Largest Rectangle in a Histogram(单调栈)

Largest Rectangle in a Histogram Time Limit:1000MS Memory Limit:65536K Total Submissions:33874 Accepted:11045 Description A histogram is a polygon composed of a sequence of r...

点点滴滴 232

Largest Rectangle in a Histogram(最大长方形)

Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17827    Accepted Submission(s): 5330 Problem Descr

香橙的博客 428

poj--2559 Largest Rectangle in a Histogram(单调栈)

poj 2559题解对于每个矩形,左右扫描一下找到第一个比其高度更小的矩形。维护一个单调递增栈,即从栈底到栈顶严格递增,这样,栈顶就是第一个更小的值。 维护两个数组,L[i] 和 R[i] 分别表示第 i 个矩形的这两个下标。#include <iostream> #include <algorithm> #include <cstdio> using namespace std;typedef

许少y 554

poj2559 Largest Rectangle in a Histogram (直方图最大矩形面积 单调栈)

问题描述: 直方图是由在公共基线处对齐的一系列矩形组成的多边形。 矩形具有相等的宽度,但可以具有不同的高度。 例如,图例左侧显示了由高度为2,1,4,5,1,3,3的矩形组成的直方图,矩形的宽度都为1: 通常,直方图用于表示离散分布,例如,文本中字符的频率。 现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。 图例右图显示了所描绘直方图的最大对齐矩形。 输入格式 输入包含几个测试用例。 每...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 445

Largest Rectangle in a Histogram(单调栈)

Sample Input 7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0 Sample Output 8 4000 求题意就是让求最大的矩形面积。 思路:这里我们既然相求最大的矩形面积,所以我们就判断以单个单个矩形的高为起点,想左右拓展的最元距离。最后维护一个最大值。但是我们用暴力判断能向左右拓展多远明显时间复杂度又不够,所以我们采用单调栈的思想,比如我们先从左到右判断以没个点为高的左边界时,我们就从左到右维护一个递增的栈。每次判断下标所在的值,与栈顶所在的值得关系.

s1050712899的博客 833
上一篇: UVa 108 Maximum Sum (贪心&最大子矩阵和)
下一篇: UVa 10245 The Closest Pair Problem (计算几何&最近点对)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值