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 ...
随机推荐
- brew update失败提示:/System/Library/Frameworks/Ruby.framework/的解决方法
本文由@ray 出品,转载请注明出处. 文章链接:http://www.cnblogs.com/wolfray/p/8040701.html 想用brew安装wget,但是提示失败,然后想先 bre ...
- CSS——规避脱标流和vertical-align
规避脱标流: 1.尽量使用标准流. 2.标准流解决不了的使用浮动. 3.浮动解决不了的使用定位. 问题解决:嵌套盒子在不使用定位的情况下定位到右上角 <!DOCTYPE html> < ...
- [Windows Server 2008] 查看ASP详细错误信息方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:查看IIS下 ...
- unable to get system library for the project
当向eclipse导入项目实例后,项目上出现红叉的错误提示,在项目属性里的Java Build Path里发现了错误提示复选选项: unable to get system library for t ...
- day02 python
列表: : 在[ ]内,可以存放多个任意类型的值: 并以逗号隔开. 一般用于存放学生的爱好:课堂的周期等等... 例如: 定义一个学生列表,可存放多个学生 list(['钱垚', '李小龙', '张全 ...
- Redis 之sentinel运维监控
有三台redis服务器6379.6380.6381,配置6379为主服务器,6380与6381都为6379的从服务器.如果主服务器6379挂掉了,我们怎么办? 方式一:手动修改从服务器的配置,将638 ...
- CentOS下修改root用户名
修改root登录用户名减少Linux云主机“被暴力破解”警告,登录云主机的时候就先显示登录失败多少次.其是公网有人在扫用弱密码破解登录. 所谓暴力破解,就是用“用户名“+”密码”穷举的方式进行远程登录 ...
- 聊聊JS动画库:Velocity.js
前言 又到了炎热的7月,很久没有更新技术文章了,原因是上月月底实习结束,从公司离职.然后最近在弄自己的项目和考驾照,为了下次公司的应聘做准备,送别了女朋友到外地,哩哩啦啦半个月把一切事情都办妥后,还是 ...
- python str操作
1. str.format():使用“{}”占位符格式化字符串(占位符中的索引号形式和键值对形式可以混合使用). 1 >>> string = 'python{}, django{} ...
- 小程序map地图多点定位
最近需求有一个类似共享单车查看附近单车的功能,看了看小程序map api对多点定位显示描述的不怎么清晰.显示定位数组添加多个时就不显示了.踩了几个坑写了几个方法.最终弄出来了.有问题建议欢迎留言. h ...