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实现单调栈的过程 阅读详情

相关推荐

分支界定法(branch and bound)与背包问题的代码实现

分支界定法(branch and bound)与背包问题的代码实现 LastEditTime: - 2021.2.3 不卖茶的吴龙茗茶 分支界定法是一种在整数规划中常用的算法,其主要思想为将大问题分割成小问题进行求解。分支界定法是围绕着一个二叉树进行的,以背包问题为例: 假设小明有一个背包,其总的容积为30,小明有三件东西可以带,三件东西的体积分别为:10,15,20。求问小明如何能够在背包中装下更大体积的物品? .

小吴同学的小屋 1885

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

国密https握手协议抓包及流程详解

使用的密码套件清单-Cipher Suite,这里服务器端选择了ECC_SM4_CBC_SM3密码套件,也就是SM2公钥算法、SM4-CBC分组密码算法和SM3杂凑算法。具体来说,这里SM2算法密钥交换算法,SM4是加密算法(SM4-CBC)、SM3是校验算法(国标要求为HMAC-SM3)。服务器的加密证书:加密证书中在同样在扩展字段中KeyUsage标识出KeyEncipherment为true和dataEncipherment为true,即数字证书中包含的公钥可用来做密钥加密密钥和数据密钥。

ryanzzzzz的博客 5849

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

高速DAC设计与实现--AD9122

目录 芯片简介: 功能配置设计 高速DAC软件驱动设计 芯片简介: AD9122 是一款双通道16位高性能数模转换器(DAC),在800MSPS工作条件下其无杂散动态范围(SFDR)高达72dBc,最高可提供1200 MSPS采样速率。 高速DAC--AD9122电路原理图 硬件设计的电路原理图如上图所示,AD9122具备针对直接变频传输应用进行优化的特性,包括复数数字调制以及增益与失调补偿。DAC输出经过优化后可直接与模拟正交调制器无缝接口,便于后期使...

独木舟216的博客 1万+

Unity 第一人称视角控制移动、旋转

第一人称视角操作此功能主要是借鉴YouTube,写的蛮好我就搬运过来让大家也试试。

qq_36515472的博客 4202

[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

Python爬虫实战:微信小程序内容采集的全面指南

在移动互联网时代,微信小程序已成为企业和个人提供服务的重要渠道。小程序中包含了大量有价值的信息,但微信官方并未提供便捷的数据获取接口。本文将详细介绍如何使用Python爬虫技术采集微信小程序内容,包括最新技术方案、完整代码实现以及应对各种反爬机制的策略。小程序运行在微信封闭环境中,无法直接访问数据通信主要通过HTTPS加密传输内容动态加载,依赖JavaScript渲染微信有严格的反爬机制。

2201_76125261的博客 3117

Largest Rectangle in a Histogram(dp)

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

牛牛博士博客 304

手把手教你学基带SOC芯片(4.2)--基带soc芯片的存储器设计

基带 SoC 中的存储器设计需要综合考虑功耗、成本和性能等因素。SRAM 适合高速缓存,DRAM 适合主内存,Flash 存储器适合非易失性存储。通过优化存储单元设计、阵列布局和外围电路,可以提高存储器的性能和效率。

MHD0815的博客 350

【Pix4d精品教程】Pix4d中央子午线细化设置(测区跨两个分带)

本文介绍了在Pix4d软件中通过修改中央子午线设置来解决跨分带测区刺点问题的方法。针对测区跨3度分带(如105°和108°之间)时像控点与靶标点偏移较大的情况,建议将中央子午线设为测区中心(如106.5°)。具体操作步骤包括:修改投影文件中的中央子午线参数,选择新的输出坐标系配置文件。该方法能有效提高像控点刺点效率,为航测内业数据处理提供便利。操作简单实用,适合大比例尺测图项目中跨分带测区的数据处理需求。

智慧空间实验室 5527

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

基于HetConv与Dual策略的YOLOv8轻量化设计-CSPHet结构的优化与实现

在计算机视觉中,YOLOv8作为目标检测领域的最新版本,通过引入多种改进来提升检测精度和速度。然而,提升精度和保持实时性能往往需要更多参数与计算量。本文提出一种结合Dual思想与HetConv的新型轻量化结构,称为CSPHet。CSPHet能够在保持YOLOv8检测精度的基础上有效减少约70万参数量,实现模型的轻量化和速度的提升。HetConv(Heterogeneous Convolution)是一种混合卷积技术,通过同时使用1x1、3x3等不同大小的卷积核,来捕捉不同尺度的特征。

博客 1324

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

POJ 2559 单调栈 Histogram

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

文西 9464

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值