利用单调栈找到木块左右的第一个比它矮的然后遍历一遍找到最大面积。。。因为是水题(?)所以就这样吧。。。
学长在讲的时候说用单调栈从前往后一次然后从后往前一次就好了= =然而为什么我觉得只要一次就好了呢?。。。一定是我的错觉
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int maxn=1e5+10;
LL n;
LL rect[maxn],r[maxn],l[maxn];
LL s[maxn],top;
int main()
{
while(~scanf("%lld",&n) && n)
{
memset(l,0,sizeof l);
memset(r,0,sizeof r);
for(LL i=0;i<n;i++) scanf("%lld",&rect[i]);
top=0;
for(LL i=0;i<n;i++)
{
while(top && rect[i]<rect[s[top-1]])
{
r[s[--top]]=i;
}
l[i]=top==0?0:s[top-1]+1;
s[top++]=i;
}
while(top)
{
r[s[top-1]]=n;
top--;
}
/*
for(int i=0;i<n;i++)
cout<<l[i]<<" "<<r[i]<<endl;
*/
LL ans=0;
for(LL i=0;i<n;i++)
{
LL s=rect[i]*(r[i]-l[i]);
if(s>ans) ans=s;
}
printf("%lld\n",ans);
}
return 0;
}