HUST 1630 largest rectangle(思维题)

来源:互联网 发布:做组织结构图软件 编辑:程序博客网 时间:2024/05/17 05:14

largest rectangle

Time Limit: 1 Sec  Memory Limit: 128 MB
Submissions: 11  Solved: 4

Description

Given n positive integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.

Input

  The first line of the input file contains an integer T (T<=100) specifying the number of test cases.
Each test case begins with a line containing an integer N (1<=N<=100000),The following N-1 lines each contain a integer A[i](1<=A[i]<=10000).

Output

 For each query, output a single line containing largest area. 

Sample Input

262156231012345679108

Sample Output

1030

HINT

Source

The 8th(2013) ACM Programming Contest of HUST



直接枚举最低点,分别枚举最低点的位置,也就是以每一个柱子为最低点进行枚举,算左边有多少高于等于它的,右边同理

计算的时候利用上一次的结果进行跳转,接近O(n)

#include <string.h>#include <stdio.h>#include <algorithm>#include <iostream>using namespace std;const int maxn = 110000;int rec[maxn],n;int l[maxn],r[maxn];int main(){    int i,j,k,t,now,ans;    scanf("%d",&t);    while(t--){        ans=-1;        scanf("%d",&n);        for(i=1;i<=n;i++) scanf("%d",&rec[i]);        memset(l,0,sizeof(l));        memset(r,0,sizeof(r));        for(i=2;i<=n;i++){            now=i-1;            while(now>0 && rec[i]<=rec[now]){                l[i]+=l[now]+1;                now-=l[now];                now--;            }        }        for(i=n-1;i>0;i--){            now=i+1;            while(now<=n && rec[i]<=rec[now]){                r[i]+=r[now]+1;                now+=r[now];                now++;            }        }        for(i=1;i<=n;i++)        ans=max(ans,(l[i]+r[i]+1)*rec[i]);        printf("%d\n",ans);    }    return 0;}


0 0