题目地址: http://poj.org/problem?id=2559
给定一些数。
每个数值代表一排按顺序紧挨着的条形的高度。
求在这些条条内部能找到的最大的矩形的面积。
利用并查集找祖宗的思想,可以使复杂度减少到近似为O(n)。
#include<iostream>
#include<cstdio>
using namespace std;
int s[101000],l[101000],r[101000];
int main(){
int i,j,n;
__int64 mx,wth,len,mul;
while(~scanf("%d",&n)){
if(n==0) break;
for(i=1;i<=n;i++){
scanf("%d",&s[i]);
l[i]=r[i]=i;
}
s[0]=s[n+1]=-1;
for(i=1;i<=n;i++)
while(s[l[i]-1]>=s[i]) l[i]=l[l[i]-1];
for(i=n;i>=1;i--)
while(s[r[i]+1]>=s[i]) r[i]=r[r[i]+1];
mx=0;
for(i=1;i<=n;i++){
len=r[i]-l[i]+1;
wth=s[i];
mul=len*wth;
if(mul>mx) mx=mul;
}
printf("%I64d\n",mx);
}
return 0;
}