题目大意:
在直方图中找出最大矩形其中小矩形(宽为1)的个数为N,N<=80000
思路分析:枚举每个宽为1的小矩形,算出往左它最多能扩展到l,往右最多能扩展到r,那么最后只要枚举一遍i,找出最大的(r-l+1)*h即可
具体如何来算l和r呢,单调队列。维护一个从小到大排序的队列,从队尾加入元素时遇到比该元素大的就让其出队,并计算该出队元素的L(或R)。
顺着扫可以算出r[i],倒着扫可以算出l[i]。
代码:
#include<stdio.h>
#define max(x,y) (x)>(y)? (x):(y)
int a[100100],q[100100];
int l[100100],r[100100];
int main()
{
int n,i,t;
unsigned long long s;
while (scanf("%d",&n),n!=0)
{
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
t=1;q[1]=1;
for (i=2;i<=n;i++)
{
while ((a[i]<a[q[t]])&&(t>0)) r[q[t]]=i-1,t--;
q[++t]=i;
}
while (t>0) r[q[t]]=n,t--;
t=1;q[1]=n;
for (i=n-1;i>0;i--)
{
while ((a[i]<a[q[t]])&&(t>0)) l[q[t]]=i+1,t--;
q[++t]=i;
}
while (t>0) l[q[t]]=1,t--;
s=0;
for (i=1;i<=n;i++)
s=max(s,(unsigned long long )(r[i]-l[i]+1)*a[i]);
printf("%llu\n",s);
}
return 0;
}