Description
最近,afy决定给TOJ印刷广告,广告牌是刷在城市的建筑物上的,城市里有紧靠着的N个建筑。afy决定在上面找一块尽可能大的矩形放置广告牌。我们假设每个建筑物都有一个高度,从左到右给出每个建筑物的高度H1,H2…HN,且0 < Hi < =1,000,000,000,并且我们假设每个建筑物的宽度均为1。
Input
输入由多组数据组成,每组数据第一行是N,且N <= 1,000,000。接下来N行每行一个数字,依次为Hi。
Output
对于每组数据,输出一行,表示广告牌的最大面积。
Sample Input
5
30
60
50
45
55
Sample Output
180
思路
- 最终的广告牌一定等于某个建筑物的高度×其能达到的最大长度;现在,建筑物的高度已知,现在只需要知道每个高度能达到的最大长度是多少
- 左右扫描法,记l[i]表示比i的左边比v[i]小的第一个位置,r[i]同理
- 运用并查集思想跳跃比较
代码
#include <iostream>
#include <cstdio>
#define maxn 1000005
using namespace std;
int n,a[maxn],l[maxn],r[maxn];
long long maxx;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{
int p=i-1;
while(a[p]>=a[i]) p=l[p];//相当于findroot
l[i]=p;//相当于指向根
}
for(int i=n;i;--i)
{
int p=i+1;
while(a[p]>=a[i]) p=r[p];
r[i]=p;
}
for(int i=1;i<=n;++i) maxx=max(maxx,(long long)(r[i]-l[i]-1)*a[i]);
printf("%lld",maxx);
return 0;
}