题目中叫求一个最大的区域,则第i个矩形对应的面积是ave[i] = (r[i] – l[i] + 1) * a[i];l[i]表示以它这个高度所能到达的最左边的位置(最左一个高度不小于它的高度的位置),而r[i]表示能到达的最右边的位置(最右一个高度不小于它的高度的位置)。

      那么这个题目就转到怎么求r[]和l[]上了。如果每次依次向左向右找,肯定会超时的。这时就会用到迭代了,比如说求a[i]的l[i],如果a[i]大于a[i-1]那么l[i] = i;如果a[i]小于a[i-1],那么l[i]肯定小于l[i-1],找l[i]就可以直接跳到l[i-1]的位置上。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
namespace std;
long ll;
int N=100010;
int l[N],r[N],a[N],n;
  10:  
int main()
  12: {
,&n)>0&&n)
  15:     {
int i=1; i<=n; i++)
  17:         {
,&a[i]);
  19:             l[i]=r[i]=i;
  20:         }
  21:         a[0]=a[n+1]=-1;
int i=1; i<=n; i++)
  23:         {
while(a[i]<=a[l[i]-1])
  25:                 l[i]=l[l[i]-1];
  26:         }
int i=n; i>0; i--)
  28:         {
while(a[i]<=a[r[i]+1])
  30:                 r[i]=r[r[i]+1];
  31:         }
  32:         ll ans=0;
int i=1; i<=n; i++)
  34:         {
  35:             ll m=(ll)a[i]*(r[i]-l[i]+1);
  36:             ans=max(m,ans);
  37:         }
,ans);
  39:     }
return 0;
  41: }

相关文章:

  • 2022-02-28
  • 2022-12-23
  • 2021-06-12
  • 2022-12-23
  • 2022-12-23
  • 2021-12-05
  • 2022-02-07
猜你喜欢
  • 2021-07-07
  • 2021-07-31
  • 2022-12-23
相关资源
相似解决方案