Largest Rectangle in a Histogram
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 21204   Accepted: 6831

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 nintegers 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

Hint

Huge input, scanf is recommended.

Source

 
 
 
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<stack>
using namespace std; struct node
{
int h,id;
node(int a,int b){ h=a; id=b; } //h存高度,id存第几块
};
int n;
stack<node> Q;
long long a[],l[],r[];
//在a[i]的高度下,能达到的左边界l[i],能达到的右边界r[i] int main()
{
while(~scanf("%d",&n))
{
if(n==) break;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
while(!Q.empty()) Q.pop(); //清空栈Q
memset(l,,sizeof(l));
memset(r,,sizeof(r));
//求l[]数组,O(n)复杂度找左边界
for(int i=;i<=n;i++)
{
if (Q.empty()) {l[i]=; Q.push(node(a[i],i)); continue; }
node u=Q.top();
if (u.h<a[i]) {l[i]=i; Q.push(node(a[i],i)); continue;}
while(u.h>=a[i]) //如果当前高度a[i],比栈顶元素低,则栈顶元素能到达的左边界也能到达。
{
l[i]=l[u.id];
Q.pop();
if (Q.empty()) break;
u=Q.top();
}
Q.push(node(a[i],i) );
} //求r[]数组,扫右边界
while(!Q.empty()) Q.pop();
for(int i=n;i>=;i--)
{
if (Q.empty()) {r[i]=i; Q.push(node(a[i],i)); continue; }
node u=Q.top();
if (u.h<a[i]) {r[i]=i; Q.push(node(a[i],i));continue;}
while(u.h>=a[i])
{
r[i]=r[u.id];
Q.pop();
if (Q.empty()) break;
u=Q.top();
}
Q.push(node(a[i],i) );
} long long sum=;
for(int i=;i<=n;i++)
sum=max(sum,a[i]*(r[i]-l[i]+));
printf("%lld\n",sum);
}
return ;
}

ZOJ 1985 Largest Rectangle in a Histogram(刷广告)2010辽宁省赛的更多相关文章

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

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

  2. DP专题训练之HDU 1506 Largest Rectangle in a Histogram

    Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...

  3. Largest Rectangle in a Histogram(DP)

    Largest Rectangle in a Histogram Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K ...

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

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

  5. Largest Rectangle in a Histogram(HDU1506)

    Largest Rectangle in a Histogram HDU1506 一道DP题: 思路:http://blog.csdn.net/qiqijianglu/article/details/ ...

  6. POJ 2559 Largest Rectangle in a Histogram

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18942   Accepted: 6083 Description A hi ...

  7. Largest Rectangle in a Histogram

    2107: Largest Rectangle in a Histogram Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 777  Solved: 22 ...

  8. HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)

    E - Largest Rectangle in a Histogram Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  9. hdu---1506(Largest Rectangle in a Histogram/dp最大子矩阵)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

随机推荐

  1. 利用JSP中的过滤器解决中文乱码问题

    首先我们创建过过滤器: package com.gbx; import java.io.IOException; import javax.servlet.Filter; import javax.s ...

  2. PCH Warning: header stop cannot be in a macro or #if block.

    在编写头文件时,遇到这么一个warning:PCH Warning: header stop cannot be in a macro or #if block. An intellisense PC ...

  3. jekins 实现Django项目的自动部署(ubuntu16.04,python2.7,django1.11)

    1.依赖的插件 如果插件下载失败 更换源 http://mirror.xmission.com/jenkins/updates/current/update-center.json 因为我们只需要构建 ...

  4. 视图层view layer

    视图层是Django处理请求的核心代码层,我们大多数Python代码都集中在这一层面. 它对外接收用户请求,对内调度模型层和模版层,统合数据库和前端,最后根据业务逻辑,将处理好的数据,与前端结合,返回 ...

  5. docker 出现 Error response from daemon

    第一步:通过dig @114.114.114.114 registry-1.docker.io找到可用IP navy@deepin:~/Desktop$ dig @.docker.io ; <& ...

  6. [ios][swift]文本框UITextField用法

    参考:http://www.hangge.com/blog/cache/detail_530.html

  7. css3转盘

    此效果涉及到 : 1. css 画图形 2. css3 动态效果 3. 贝塞尔曲线 用法 <style> .lds-hourglass { display: inline-block; p ...

  8. Lua---执行

    1.交互式: 2.脚本式(在命令行不要启动lua解释器,直接输): Testlua.lua 的内容: print("Hello World!")

  9. hdu-3276-dp+二分+单调队列

    Star Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. 在EO中获取某字段基于表的列名

    //生成EO的时候自动生成的字段 public static final int BRIEFINTRO = 88; String[][] str = null; str = new String[][ ...