http://acm.hdu.edu.cn/showproblem.php?pid=1506
#include<iostream>
using namespace std;
#define N 100001
int l[N],r[N];
int h[N];
int main(void)
{
int n;
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
l[i]=r[i]=i;
}
for(int i=1;i<=n;i++)
while(l[i]>1&&h[l[i]-1]>=h[i])
l[i]=l[l[i]-1];
for(int i=n;i>=1;i--)
while(r[i]<n&&h[r[i]+1]>=h[i])
r[i]=r[r[i]+1];
__int64 ans=0;
for(int i=1;i<=n;i++)
{
__int64 temp=(__int64)(r[i]-l[i]+1)*h[i];
if(ans<temp)
ans=temp;
}
printf("%I64d/n",ans);
}
}
注意注意:求r[]的时候要从后往前,不然就没有优化的效果了!还有就是算的时候要注意(__int64)强制转化。