POJ2559 Largest Rectangle in a Histogram 单调栈
题目大意
有一个直方图,其所有矩形的底均是1(以后简称小矩形)。给出这些矩形的高度,求这些矩形的并集中存在的面积最大的矩形(简称大矩形)的面积。
题解
大矩形的高必然一边等于一个小矩形的高,另一边小于等于另一个小矩形的高。
我们现考虑面积最大矩形左边高等于其所在小矩形的高的情况,则其右边高小于等于其对应的小矩形的高(以后将此简称为左等高矩形)。我们要维护一个单调栈,使得栈里的矩形的高度都是单调递增的。一个一个枚举小矩形,如果当前小矩形高度比栈顶的矩形高度高或等,则如果所求大矩形是个左边为栈内矩形的左等高矩形,则这条小矩形就必然位于这个大矩形的右边所在小矩形的位置及左侧(性质1)(因为宽度越宽越好)。将此小矩形推入栈中。此情况一直延续到当前小矩形比站定的矩形高度低时。此时如果把此小矩形推入栈内,栈就不满足性质1了。因此这时便是开始利用性质1结算(当前小矩形左方的)左等高矩形的时刻了(小矩形高度乘以到当前小矩形的宽度)。
那么右等高矩形呢?右等高矩形相当于将该大矩形以上部分的小矩形削掉以后的左等高矩形。因此当遇到上述的第二种情况时,当栈顶矩形高度小于当前小矩形高度时,退出,然后将宽度为累加值,高度为当前小矩形高度的矩形推入栈内即可。注意最后要增加一个高度为0的小矩形,来应对大矩形右边为最右一个小矩形的情况。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std; const int MAX_N = 100010;
int A[MAX_N]; struct Rect
{
int Height, Width; Rect(int height, int width):Height(height),Width(width){}
};
stack<Rect> St; int main()
{
int n;
while (scanf("%d", &n) && n)
{
for (int i = 1; i <= n; i++)
scanf("%d", A + i);
long long ans = 0;
A[++n] = 0;
St.push(Rect(A[1], 1));
for (int i = 2; i <= n; i++)
{
if (A[i] >= St.top().Height)
St.push(Rect(A[i], 1));
else
{
long long width = 0;
while (!St.empty() && St.top().Height >= A[i])
{
ans = max(ans, (long long)St.top().Height * (width+=St.top().Width));
St.pop();
}
St.push(Rect(A[i], width + 1));
}
}
printf("%lld\n", ans);
}
return 0;
}
POJ2559 Largest Rectangle in a Histogram 单调栈的更多相关文章
- POJ2559 Largest Rectangle in a Histogram —— 单调栈
题目链接:http://poj.org/problem?id=2559 Largest Rectangle in a Histogram Time Limit: 1000MS Memory Lim ...
- poj 2559 Largest Rectangle in a Histogram - 单调栈
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19782 ...
- POJ 2559 Largest Rectangle in a Histogram(单调栈)
传送门 Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...
- POJ 2559 Largest Rectangle in a Histogram (单调栈或者dp)
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15831 ...
- hdu 1506 Largest Rectangle in a Histogram(单调栈)
L ...
- po'j2559 Largest Rectangle in a Histogram 单调栈(递增)
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29498 ...
- HDU - 1506 Largest Rectangle in a Histogram (单调栈/笛卡尔树)
题意:求一个直方图中最大矩形的面积. 很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的 ...
- PKU 2559 Largest Rectangle in a Histogram(单调栈)
题目大意:原题链接 一排紧密相连的矩形,求能构成的最大矩形面积. 为了防止栈为空,所以提前加入元素(-1,0) #include<cstdio> #include<stack> ...
- Largest Rectangle in a Histogram /// 单调栈 oj23906
题目大意: 输入n,,1 ≤ n ≤ 100000,接下来n个数为每列的高度h ,0 ≤ hi ≤ 1000000000 求得最大矩阵的面积 Sample Input 7 2 1 4 5 1 3 34 ...
随机推荐
- PHP面相对象中的重载与重写
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.Overloaded的方法是可以改变返回值的类型.也就是说,重载的返回值类型可以相同也可 ...
- Appium Python API 汇总
最近在学习Python自动化,网络搜集而来,留着备用, 方便自己也方便他人.感谢总结的人! 1.contexts contexts(self): Returns the contexts within ...
- html5——多媒体(四)
全屏兼容 box.requestFullscreen(); box.webkitRequestFullScreen(); box.mozRequestFullScreen(); <!DOCTYP ...
- (转)Hibernate的配置详解
http://blog.csdn.net/yerenyuan_pku/article/details/65041077 在<Hibernate快速入门>一文中,我有讲到Hibernate的 ...
- 如何创建一个项目,让gitlab自动触发jenkins进行构建
前进是:你已经配置好jenkins+gitlab自动化布置了,这里只是常规构建新的项目时,需要做的配置,记录下来,以免忘了又着急 参考这篇博客: https://www.jianshu.com/p/e ...
- 原型链、构造函数、箭头函数、se6数组去重
原型链 例子如下: var arr = [1, 2, 3]; 其原型链为:arr ----> Array.prototype ----> Object.prototype ----> ...
- Nodejs介绍及其安装
一.Nodejs介绍 Nodejs英文网:https://nodejs.org/en/ Nodejs中文网:http://nodejs.cn/ Node.js 是一个基于 Chrome V8 引擎的 ...
- 34.分组聚合操作—bucket
主要知识点: 学习聚合知识 一.准备数据 1.家电卖场案例背景建立index 以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析 ...
- copy contents of file with variable number in Matlab
input : transient.case output: transient_1.case, transient_2.case, transient_3.case ... ************ ...
- HTML的基本操作学习----常用标签,特殊符号,列表,表格,表单
什么是HTML 常用标签 标题标签 段落标签 粗体标签+斜体 超链接标签 图片标签 列表标签 无序标签 有序标签 自定义列表 div标签 特殊符号 表格 表单 HTML 什么是 HTML? HTM ...