本题思路
用单调栈维护高和宽,
当有数进来或被弹掉时就统计。
最后将栈内剩余的所有数依次弹掉并统计。
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
long long a[100010];
long long n,tail;
struct node
{
long long h,w;
}z[100010];
int main()
{
cin>>n;
while(n!=0)
{
for(int i=1; i<=n; i++)
scanf("%lld",&a[i]);
long long ans=0,js=0;
for(int i=1; i<=n; i++)
{
long long tmp=0;
while(z[tail-1].h>=a[i]&&tail>0) //维护单调递增
{
js=z[tail-1].h*(z[tail-1].w+tmp);
if(js>ans)
ans=js;
tmp+=z[tail-1].w; //宽度统计
tail--;
}
z[tail].h=a[i]; //高度和宽度入栈。
z[tail].w=1+tmp;
tail++;
}
long long tmp=0;
while(tail>0) //依次弹出,操作同上
{
js=z[tail-1].h*(z[tail-1].w+tmp);
if(js>ans)
ans=js;
tmp+=z[tail-1].w;
tail--;
}
printf("%lld\n",ans);
cin>>n;
if(n==0) //防输入错误
break;
}
return 0;
}