HISTOGRA - Largest Rectangle in a Histogram

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn=1e5+7;
 7 int n,fr1,fr2,tl1,tl2,ans;
 8 int h[maxn],l[maxn],r[maxn],q1[maxn],q2[maxn];
 9 void pre(){
10   memset(h,0,sizeof(h));
11   memset(l,0,sizeof(l));
12   memset(r,0,sizeof(r));
13   memset(q1,0,sizeof(q1));
14   memset(q2,0,sizeof(q2));
15   fr1=1;tl1=0;fr2=n;tl2=n+1;
16   ans=0;
17 }
18 int main(){
19   while(cin>>n){
20     pre();
21     for(int i=1;i<=n;i++) cin>>h[i];
22     q1[++tl1]=1;l[1]=1;
23     for(int i=2;i<=n;i++){
24       if(h[i]<h[q1[tl1]]) l[i]=1;
25       else{
26           int tail=tl1;
27         while(h[i]>=h[q1[tail]]&&tail>=fr1) tail--;
28         l[i]=q1[tail]+1;
29       }
30         if(h[i]<h[q1[tl1]]) q1[++tl1]=i;    
31     } 
32     q2[--tl2]=n;r[n]=n;
33     for(int i=n-1;i>=1;i--){
34       if(h[i]<h[q2[tl2]]) r[i]=n;
35       else{
36         int tail=tl2;
37         while(h[i]>=h[q2[tail]]&&tail<=fr2) tail++;
38         r[i]=q2[tl2]+1;
39       }
40       if(h[i]<h[q2[tl2]]) q2[--tl2]=i;
41     }
42     for(int i=1;i<=n;i++){
43       ans=max(ans,(r[i]-l[i]+1)*h[i]);
44     }
45     cout<<ans<<endl; 
46   }
47   return 0;
48 } 

猜你喜欢

转载自www.cnblogs.com/lcan/p/9780917.html