这题和acwing 152 配合这着做比较好 152可以说是这题的加强版;
这题也可以说是单调栈的模板例题了;
这题的思路大致是列举每个i 找到i左边第一个低于h[i]的和右边第一个低于h[i];
暴力做法是O(n^2);优化后是O(n)的 ,
所以单调队列还是很强大的
做法就是离线先处理左边的低于h[i]的
本来想写完的 只不过这编辑器中英文切换太难受了,还是不写了
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
int h[maxn],l[maxn],r[maxn];
int n;
void get(int a[]){
int stk[maxn],cnt=0;
stk[0]=0;
for(int i=1;i<=n;i++){
while(h[stk[cnt]]>=h[i])cnt--;
a[i]=stk[cnt],stk[++cnt]=i;
}
}
int main()
{
h[0]=-1;
while(~scanf("%d",&n)&&n){
for(int i=1;i<=n;i++)scanf("%d",&h[i]);
get(l);
reverse(h+1,h+1+n);
get(r);
ll res=0;
for(int i=1;i<=n;i++)res=max(res,(ll)h[i]*(n-r[i]-l[n+1-i]));
printf("%lld\n",res);
}
return 0;
}