广告印刷-并查集

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;
}

猜你喜欢

转载自www.cnblogs.com/wuwendongxi/p/13365142.html