POJ2559
维护单调栈
POJ数据神坑
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
__int64 a[100015],s[100015];
__int64 w[100015];
__int64 ans=0;
__int64 max(__int64 a,__int64 b)
{
if(a>b)return a;
else
return b;
}
int main()
{
int n;
while(scanf("%d",&n)!=0)
{
if(n==0)break;
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
ans=0;
int p=0;
a[n+1]=0;
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
for(int i=1;i<=n+1;i++)
{
if(a[i]>s[p])
{
s[++p]=a[i];
w[p]=1;
}
else
{
__int64 width=0;
while(s[p]>a[i])
{
width+=w[p];
ans=max(ans,(__int64)width*s[p]);
p--;
}
s[++p]=a[i];
w[p]=width+1;
}
}
printf("%I64d\n",ans);
}
return 0;
}