largest rectangle
Time Limit: 1 Sec Memory Limit: 128 MBSubmissions: 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.
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
2 6 2 1 5 6 2 3 10 1 2 3 4 5 6 7 9 10 8
Sample Output
10 30
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;
}