hdu 1506 Largest Rectangle in a Histogram
//给一个柱形图,找到其中面积最大的矩形。 //对于每一个柱形,找到它最左边的,高度大于等于它下标, 同理也要找到它最右边的,高度大于等于它的 下标。 //但如果普通的顺序遍历的话,最坏情况会退化成O(n^2),这里的优化方法就是,如果当前查找的柱形比它大于等于,那么就直接去找当前柱形的边界。 //这样的话,查找就是跳跃式的。 #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; #define N 100005 long long h[N],l[N],r[N]; int main() { int n,tmp; while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) scanf("%I64d",&h[i]); h[n+1]=h[0]=-1; l[1]=1; r[n]=n; for(int i=1;i<=n;i++) { tmp=i; while(1) { if(h[tmp-1]>=h[i]) tmp=l[tmp-1]; else break; } l[i]=tmp; } for(int i=n;i>=1;i--) { tmp=i; while(1) { if(h[tmp+1]>=h[i]) tmp=r[tmp+1]; else break; } r[i]=tmp; } long long ans=0; for(int i=1;i<=n;i++) { ans=max(ans,h[i]*(r[i]-l[i]+1)); } printf("%I64d\n",ans); } return 0; }