题目大意

  有一个直方图,其所有矩形的底均是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 单调栈的更多相关文章

  1. POJ2559 Largest Rectangle in a Histogram —— 单调栈

    题目链接:http://poj.org/problem?id=2559 Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Lim ...

  2. poj 2559 Largest Rectangle in a Histogram - 单调栈

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19782 ...

  3. POJ 2559 Largest Rectangle in a Histogram(单调栈)

    传送门 Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  4. POJ 2559 Largest Rectangle in a Histogram (单调栈或者dp)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15831 ...

  5. hdu 1506 Largest Rectangle in a Histogram(单调栈)

                                                                                                       L ...

  6. po'j2559 Largest Rectangle in a Histogram 单调栈(递增)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29498 ...

  7. HDU - 1506 Largest Rectangle in a Histogram (单调栈/笛卡尔树)

    题意:求一个直方图中最大矩形的面积. 很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的 ...

  8. PKU 2559 Largest Rectangle in a Histogram(单调栈)

    题目大意:原题链接 一排紧密相连的矩形,求能构成的最大矩形面积. 为了防止栈为空,所以提前加入元素(-1,0) #include<cstdio> #include<stack> ...

  9. 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 ...

随机推荐

  1. PHP配置步骤

    背景: 作为web前端人员,必不可少的会接触到一些服务器端的脚本语言,比如PHP.因为最近在进行相关知识的总结,同时也回顾一下PHP基础知识.这次总结先从PHP的开始说起,即PHP的配置步骤. 什么是 ...

  2. C#入门经典 Chapter4 流程控制

    4.1布尔逻辑 布尔比较运算符 ==  !=   <   >    <=    >= 处理布尔值的布尔值运算符 ! & | ^(异或) 条件布尔运算符 &&am ...

  3. Listview模板

    每次写listview都要翻以前的代码,好烦.所以记下模板,方便下次的使用. xml文件部分代码: <ListView android:id="@+id/listview" ...

  4. Centos7搭建lamp环境

    首先安装apache Centos7默认已经安装httpd服务,只是没有启动. 如果需要重新安装,输入 yum install -y httpd 启动服务: systemctl start httpd ...

  5. 03--QT教程(转自:豆子)

    http://blog.51cto.com/zt/20

  6. HDU_2212_水

    DFS Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  7. Git学习总结(标签管理)

    在Git中打标签非常简单,首先,切换到需要打标签的分支上: 然后,敲命令git tag <name>就可以打一个新标签: $ git tag v1. 可以用命令git tag查看所有标签: ...

  8. eclipse常用设置之项目分组查看

    1.打开‘NaviNavigator’ 视图,windows-->show views->NaviNavigator; 2.在NaviNavigator视图下选择select workin ...

  9. Array.prototype.slice.call()的理解

    最近在看廖雪峰的JS课程,浏览器中的操作DOM的那一章,有这样一道题. JavaScript Swift HTML ANSI C CSS DirectX <!-- HTML结构 --> & ...

  10. $(document).ready(function(){}) 与 window.onload = function(){} 区别

    $(document).ready(fucntion(){ //在页面dom结构加载完毕后执行代码, }) window.onload = function(){ //页面所有内容加载完毕后,执行代码 ...