题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506
大意:求一个最大的区域,则第i个矩形对应的面积是ave[i] = (r[i] - l[i] + 1) * a[i];l[i]表示以它这个高度所能到达的最左边的位置(最左一个高度不小于它的高度的位置),而r[i]表示能到达的最右边的位置(最右一个高度不小于它的高度的位置)。
这道题实际上就是对于任意数x求大于等于x的最左数的下标和最右数的下标;直接进行迭代就行;
View Code
1 #include<iostream> 2 #include<algorithm> 3 const int N=110000; 4 using namespace std; 5 __int64 h[N],l[N],r[N]; 6 7 int main(){ 8 int n; 9 while(scanf("%d",&n)!=EOF){ 10 if(n==0)break; 11 for(int i=1;i<=n;i++){ 12 scanf("%I64d",&h[i]); 13 l[i]=r[i]=i; 14 } 15 h[0]=h[n+1]=-1; 16 for(int i=1;i<=n;i++){ 17 while(h[l[i]-1]>=h[i]) 18 l[i]=l[l[i]-1]; 19 } 20 for(int i=n;i>=1;i--){ 21 while(h[r[i]+1]>=h[i]) 22 r[i]=r[r[i]+1]; 23 } 24 __int64 Max=0,ans=0; 25 for(int i=1;i<=n;i++){ 26 ans=(r[i]-l[i]+1)*h[i]; 27 Max=max(ans,Max); 28 } 29 printf("%I64d\n",Max); 30 } 31 return 0; 32 }