POJ2559 Largest Rectangle in a Histogram(单调栈)

题目给一个由几个相连接的矩形组成的多边形,计算多边形包含的最大的矩形的面积。

POJ2559

要求的矩形的高一定是某一个用来组合的矩形的高;如果枚举每个矩形作为高的话,那样长就是这个矩形能向左向右继续延伸矩形的长度了。

所以这题本质也是用单调栈在O(n)计算出每个数作为最小数向左和向右能延伸的最长距离。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 #define MAXN 111111
 5 int a[MAXN];
 6 int l[MAXN],r[MAXN];
 7 int stack[MAXN],top;
 8 int main(){
 9     int n;
10     while(~scanf("%d",&n) && n){
11         for(int i=1; i<=n; ++i){
12             scanf("%d",a+i);
13         }
14         a[++n]=-1;
15         top=0;
16         for(int i=1; i<=n; ++i){
17             l[i]=r[i]=i;
18             while(top && a[stack[top]]>a[i]){
19                 l[i]=l[stack[top]];
20                 r[stack[top]]=i-1;
21                 --top;
22             }
23             if(top && a[stack[top]]==a[i]) l[i]=l[stack[top]];
24             stack[++top]=i;
25         }
26         long long res=0;
27         for(int i=1; i<n; ++i){
28             res=max(res,(r[i]-l[i]+1LL)*a[i]);
29         }
30         printf("%lld\n",res);
31     }
32     return 0;
33 } 

 

posted @ 2016-02-28 19:55  WABoss  阅读(911)  评论(0编辑  收藏  举报