首页 > 其他分享 >洛谷题单指南-前缀和差分与离散化-P1904 天际线

洛谷题单指南-前缀和差分与离散化-P1904 天际线

时间:2024-08-05 23:19:26浏览次数:17  
标签:node 天际线 int 洛谷题 P1904 高度 坐标 端点 建筑

原题链接:https://www.luogu.com.cn/problem/P1904

题意解读:给出(左端点,高度,右端点)表示的若干建筑,要输出其轮廓,所谓轮廓就是每个点被覆盖的最高建筑的高度所描绘的线。

解题思路:

如果能计算每个点被覆盖的最高建筑的高度,用数组h[10005]保存,那么输出轮廓的过程只需要枚举每一个点,如果点的高度和前一个点不同,则输出该点的坐标和高度,即可得到答案。

问题变成,如何计算每个点被覆盖的最高建筑的高度?

由于同一个点可能有多个建筑覆盖,因此可以将建筑按照左端点从小到大排序,

枚举1-10000每一个坐标i

  取出左端点最小的建筑,如果有多个左端点相同的建筑,则取出所有,取高度最大的那个maxh,记录h[i] = maxh

  已经计算过的坐标可以从建筑中移除,也就是将左端点坐标+1,直到左端点等于右端点

由于要实现每次对建筑左端点坐标+1,再枚举下一个坐标时依然要取左端点最小的建筑,可以借助于优先队列

建筑表示为struct node {int l, h, r},

优先队列按l小的在堆顶

struct node
{
    int l, h, r;
    bool operator < (const node &a) const
    {
        return l > a.l;
    }
};

100分代码:

#include <bits/stdc++.h>
using namespace std;

struct node
{
    int l, h, r;
    bool operator < (const node &a) const
    {
        return l > a.l;
    }
};

priority_queue<node> q;
int high[10005]; //每个点对应的最高建筑高度

int main()
{
    int l, h, r;
    while(cin >> l >> h >> r)
    {
        q.push({l, h, r});
    }

    for(int i = 1; i <= 10000; i++)
    {
        int maxh = 0;
        while(q.size() && q.top().l == i)
        {
            node tmp = q.top();
            maxh = max(maxh, tmp.h);
            q.pop();
            if(++tmp.l != tmp.r) q.push(tmp);
        }
        high[i] = maxh;
    }

    for(int i = 1; i <= 10000; i++)
    {
        if(high[i] != high[i - 1])
        {
            cout << i << " " << high[i] << " ";
        }
    }

    return 0;
}

 

标签:node,天际线,int,洛谷题,P1904,高度,坐标,端点,建筑
From: https://www.cnblogs.com/jcwy/p/18344225

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P3029 [USACO11NOV] Cow Lineup S
    原题链接:https://www.luogu.com.cn/problem/P3029题意解读:不同的坐标位置有不同种类的牛,要计算一个最小的区间,包括所有种类的牛。解题思路:由于坐标位置不连续,并且数值范围较大,因此需要离散化处理,将坐标处理成1~n连续分布由于种类编号数值范围也比较大,也需要离散化处理,去重后的......
  • 洛谷题单指南-前缀和差分与离散化-P4552 [Poetize6] IncDec Sequence
    原题链接:https://www.luogu.com.cn/problem/P4552题意解读:对一组数字序列,进行若干次区间+1或者-1操作,最终使得所有数字一样,计算最少的操作次数,以及能得到多少种不同序列。解题思路:要使得序列每一个数字都相同,则其差分除了第一项之外其余项都是0。因此,问题转化为:给定一个差分数......
  • 洛谷题单指南-前缀和差分与离散化-P2882 [USACO07MAR] Face The Right Way G
    原题链接:https://www.luogu.com.cn/problem/P2882题意解读:一个有F、B组成的序列,每次可以翻转k个连续子序列,翻转:F->B,B->F,计算最少翻转多少次可以将序列都变成F,并求相应的k。解题思路:为方便处理,设F为1,B为01、朴素做法枚举k:1~n  枚举序列,一旦遇到0,就将连续k个字符翻转,如果可......
  • 洛谷题单指南-前缀和差分与离散化-P1083 [NOIP2012 提高组] 借教室
    原题链接:https://www.luogu.com.cn/problem/P1083题意解读:已知第i天有r[i]个教室可以供租借,有m个租借教室的订单,第i订单需要在第s[i]~t[i]天区间内租借d[i]个教室,计算是否全部订单都能满足,如果不满足要输出从第几个订单开始不满足。解题思路:1、朴素做法枚举1~m个订单,通过差分......
  • 洛谷题单指南-前缀和差分与离散化-P3406 海底高铁
    原题链接:https://www.luogu.com.cn/problem/P3406题意解读:1-n个城市共了n段路,第i段路不买卡票价a[i],买卡票价b[i](卡本身花费c[i]),给定一个路程顺序,计算最少的通行费用。解题思路:根据路程,计算每段路各走了多少次,然后对于每段路,计算买卡和不买卡两种花费,取较小的累加即可。如何......
  • 洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G
    原题链接:https://www.luogu.com.cn/problem/P3017题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。解题思路:要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多......
  • 洛谷题单指南-前缀和差分与离散化-P2004 领地选择
    原题链接:https://www.luogu.com.cn/problem/P2004题意解读:在一个n*m的矩阵中,找到边长为c的正方形,使得正方形范围内的数之和最大,输出正方形的左上角坐标。解题思路:二维前缀和的简单应用第一步:计算二维前缀和第二步:枚举边长为c的正方形左上角,计算正方形区域的数之和,更新答案第......
  • 洛谷题单指南-前缀和差分与离散化-P1884 [USACO12FEB] Overplanting S
    原题链接:https://www.luogu.com.cn/problem/P1884题意解读:给定n个矩形的平面直角坐标系下左上角、右下角的坐标,计算这n个矩形能覆盖的的格子数。解题思路:直观上来看,此题是一个差分应用,针对二维差分数组,将n个矩形区域内每个格子的值加1,然后统计有多少个不为0的格子即可。但是!坐......
  • 洛谷题单指南-前缀和差分与离散化-P1496 火烧赤壁
    原题链接:https://www.luogu.com.cn/problem/P1496题意解读:给定n个区间[a,b),计算所有区间覆盖的总长度。解题思路:方法1、离散化先思考一种比较直观的思路:既然要计算多个区间覆盖的总长度,可以枚举每一个区间[a,b),通过一个桶数组来标记区间中所有的点f[x]=1,最终统计所有为1的......
  • 洛谷题单指南-前缀和差分与离散化-P3397 地毯
    原题链接:https://www.luogu.com.cn/problem/P3397题意解读:给定一个n*n的矩阵,每个元素初始值为0,再将m个子矩阵中的元素都增加1,统计每个元素最终的值。解题思路:1、暴力法枚举每一个子矩阵,将对应元素值加1,时间复杂度为1000^3,不可行。2、二维差分对于给定二维数组s[][],给指定区......