Largest Rectangle in a Histogram 常用技巧 stack的运用
Largest Rectangle in a Histogram
给出一些连续的长度为1的长方形。问所能构成的矩形的最大面积是多少?
设最大的面积的左端点为L,又端点为R,H=min(h[i]), i>=L&&i<=R; 我们分析h[L-1],一定有h[L-1]<h[L],不然的话可以扩充。 同理 一定有 h[R]>h[R+1]
我们以每个高度去构建长方形。找出 [L,R]. 我们要找出j<=i &&a[j]<=a[i]的最大的j; 根据问题的性质。 假设 a[1]>=a[2]的话,现在i>2, 如果a[2]<a[i]的话,a[1]需要考虑了。如果a[2]>=a[i]的话,a[1]一定大于a[i]。所以可以构建单调stack.
R 同样处理。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include <map> 12 #include <list> 13 #include <iomanip> 14 #include <cstdlib> 15 #include <sstream> 16 using namespace std; 17 typedef long long LL; 18 const int INF=0x5fffffff; 19 const double EXP=1e-6; 20 const int MS=100005; 21 22 int n; 23 int deq[MS]; 24 int a[MS]; 25 int L[MS],R[MS]; 26 int s,t; 27 28 int main() 29 { 30 while(scanf("%d",&n)&&n) 31 { 32 for(int i=0;i<n;i++) 33 scanf("%lld",&a[i]); 34 s=t=0; 35 for(int i=0;i<n;i++) 36 { 37 while(t>0&&a[deq[t-1]]>=a[i]) 38 t--; 39 L[i]=t==0?0:(deq[t-1]+1); 40 deq[t++]=i; 41 } 42 s=t=0; 43 for(int i=n-1;i>=0;i--) 44 { 45 while(t>0&&a[deq[t-1]]>=a[i]) 46 t--; 47 R[i]=t==0?n:deq[t-1]; //[L,R) 48 deq[t++]=i; 49 } 50 LL ans=0LL; 51 for(int i=0;i<n;i++) 52 ans=max(ans,(LL)a[i]*(R[i]-L[i])); 53 printf("%lld\n",ans); 54 } 55 return 0; 56 }