zoukankan      html  css  js  c++  java
  • 广告印刷-并查集

    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;
    }
    
  • 相关阅读:
    ElasticSearch基本学习
    Liunx下的系统负荷
    记录调试树(方便跟到具体的调用)
    树形结构的数据库的存储
    VS快速生成JSON数据格式对应的实体
    关于理想化的编程
    通过Chrome浏览器检测和优化页面
    一个关于Random算法的问题
    MVC中的一般权限管理
    文件读写锁
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13365142.html
Copyright © 2011-2022 走看看