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. mybatis 关于传long 类型问题

    @Datapublic class PrealertPackageStatusDTO { private Integer nowStatus; /** * packageStatusEnum */ p ...

  2. MUI --- h.js无效

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. rostopic 命令

    rostopic bw display bandwidth used by topic// rostopic delay display delay for topic which has heade ...

  4. 安装 mysql8.0.13 (Ubuntu 16.04 desktop amd64)

    1.下载mysql deb https://dev.mysql.com/downloads/mysql/ #移动到/usr/local/src/目录,解压 sudo mv mysql-server_8 ...

  5. 软件测试实习生 带人计划 Plan for Training Inten

    临时拟了个提纲,以后慢慢补充吧 序号 培训内容 时间安排 1 根据项目需求,编写测试用例,针对存储过程 2 存储过程的走读,以及怎样执行测试用例和查看结果 3 根据项目需求,编写测试用例,针对接口[C ...

  6. [ios]ios读写文件本地数据

    参考:http://blog.csdn.net/tianyitianyi1/article/details/7713103 ios - Write写入方式:永久保存在磁盘中.具体方法为:第一步:获得文 ...

  7. [设计模式][C++]单例模式

    参考:http://blog.csdn.net/hackbuteer1/article/details/7460019 单例模式意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有 ...

  8. air for android 使用ANE来获取安卓手机IMEI号

    一首页创建一个ANE文件 1 使用FlashBuilder 或者Eclipse 创建一个新的android项目     A 创建文件Extension.java package com.dabing. ...

  9. 滑动窗口解决Substring Search Problem

    2018-07-18 11:19:19 一.Minimum Window Substring 问题描述: 问题求解: public String minWindow(String s, String ...

  10. 解决SpringBoot更新数据到MySQL乱码问题

    怀疑数据库没有采用UTF8编码. DB也是UTF8格式,没有问题. 怀疑Hibernate连接字符串问题. application.properties修改为通过utf8连接mysql,但是问题依然没 ...