题目链接:
大意:求一个最大的区域,则第i个矩形对应的面积是ave[i] = (r[i] - l[i] + 1) * a[i];l[i]表示以它这个高度所能到达的最左边的位置(最左一个高度不小于它的高度的位置),而r[i]表示能到达的最右边的位置(最右一个高度不小于它的高度的位置)。
这道题实际上就是对于任意数x求大于等于x的最左数的下标和最右数的下标;直接进行迭代就行;
View Code
1 #include2 #include 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 }