题目地址:

https://www.luogu.com.cn/problem/P1904

题目描述:
Latium省的Genoa是亚平宁半岛西海岸北端的一片土地,自然资源丰富,却无人居住。你受到罗马执政官Caesar的委任,前往Genoa建立新的城市。Caesar对这次任务的要求是在Genoa这片土地上建立起一座繁荣的城市,他将以此作为衡量你的表现的标准。

正在你大刀阔斧地进行城市建设的时候,Caesar突然写信给你,说他要检查Genoa的建设情况。Caesar希望知道你的城市是什么样子,但是他又非常的忙,所以他只要你描述一下城市的轮廓就可以了,他将依照城市的轮廓决定你的薪水。

怎样描述一个城市的轮廓呢?我们知道Genoa所有的建筑共享一个地面,你可以认为它是水平的。所有的建筑用一个三元组(Li,Hi,Ri)(L_i,H_i,R_i)(Li​,Hi​,Ri​),其中LiL_iLi​和RiR_iRi​分别是建筑的左坐标和右坐标,HiH_iHi​就是建筑的高度。在下方所示的图表中左边建筑物描述如下(1,11,5)(1,11,5)(1,11,5),(2,6,7)(2,6,7)(2,6,7),(3,13,9)(3,13,9)(3,13,9),(12,7,16)(12,7,16)(12,7,16),(14,3,25)(14,3,25)(14,3,25),(19,18,22)(19,18,22)(19,18,22),(23,13,29)(23,13,29)(23,13,29),(24,4,28)(24,4,28)(24,4,28),右边用轮廓线的顺序(1,11,3,13,9,0,12,7,16,3,19,18,22,3,23,13,29,0)(1,11,3,13,9,0,12,7,16,3,19,18,22,3,23,13,29,0)(1,11,3,13,9,0,12,7,16,3,19,18,22,3,23,13,29,0)表示:

输入格式:
在输入数据中,你将得到一系列表示建筑的三元组。在输入数据中所有建筑的坐标中的数值都是小于100001000010000的正整数,且至少有111幢建筑,最多有500050005000幢建筑。在输入输入中每幢建筑的三元组各占一行。三元组中的所有整数应由一个或多个空格分开。

输出格式:
在输出数据中,你被要求给出城市的轮廓线。你可以这样来描述:对于所有轮廓线上的折点,按顺序排好,第奇数个点输出xxx坐标,第偶数个点输出yyy坐标,两个数之间用空格分开。

可以用分块来做(当然也可以用线段树,思路类似。可以参考https://blog.csdn.net/qq_46105170/article/details/121259936)。思路是,将地平线视为一个数组,一开始全为000,每个建筑(l,h,r)(l,h,r)(l,h,r)可以视为一个修改,将该数组的(l,r−1)(l,r-1)(l,r−1)这一段的每一个数xxx变为max⁡{x,h}\max\{x,h\}max{x,h}。这一点可以用分块来做,每次操作时间O(n)O(\sqrt n)O(n​)。最后只需要将整个数组还原回来,找到转折点即可。代码如下:

#include <cmath>
#include <iostream>
using namespace std;const int N = 1e4 + 10, M = 500;
int n, m;
int w[N], bel[N];
int len;
int height[M];
struct Query {int l, r, h;
} q[N];void modify(int l, int r, int h) {int bl = bel[l], br = bel[r];if (bl == br)for (int i = l; i <= r; i++) w[i] = max(w[i], h);else {int i = l, j = r;while (bel[i] == bl) w[i] = max(w[i], h), i++;while (bel[j] == br) w[j] = max(w[j], h), j--;for (int k = bel[i]; k <= bel[j]; k++) height[k] = max(height[k], h);}
}int main() {int l, r, h;while (cin >> l >> h >> r) {q[++m] = {l, r - 1, h};n = max(n, q[m].r);}n++;len = sqrt(n);for (int i = 1; i <= n; i++) bel[i] = i / len;for (int i = 1; i <= m; i++) modify(q[i].l, q[i].r, q[i].h);int y = 0;for (int i = 1; i <= n; i++)if (max(w[i], height[bel[i]]) != y) {y = max(w[i], height[bel[i]]);printf("%d %d ", i, y);}
}

时间复杂度O(mn+n)O(m\sqrt n+n)O(mn​+n),nnn为建筑的左右点范围,mmm为建筑个数,空间O(n)O(n)O(n)。

【洛谷】P1904 天际线相关推荐

  1. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  2. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  3. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  4. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  5. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  6. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  7. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  8. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  9. 洛谷专题训练 ——【算法1-1】模拟与高精度

    洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...

  10. 洛谷P1006 传纸条 (棋盘dp)

    好气,在洛谷上交就过了,在caioj上交就只有40分 之前在51nod做过这道题了. https://blog.csdn.net/qq_34416123/article/details/8180902 ...

最新文章

  1. android 根据时间获取时间对应的星期
  2. java pdf打印_Java 打印PDF文档
  3. 【土地评价与土地管理】案例:某地区土地农业利用潜力评价
  4. 使用 putty 免密码 ssh 登录 mac os
  5. 【Spring】Spring boot 中文乱码
  6. Mac 上如何使用“备忘录”管理扫描文稿?
  7. [淘宝商城首页]-图片灯箱明暗遮罩效果之jquery版
  8. C语言 生成随机数 srand用法 伪随机函数rand srand需不需要重新播种问题 srand该不该放在循环里
  9. 我只是还迷惘,我们只是不言伤的孩纸:伤感QQ空间日志
  10. MobiCom2015阅读表(Poster)
  11. 工作中的Linux防火墙心得
  12. 任意多边形的面积(C语言)
  13. FFmpeg进阶:音视频滤镜概述
  14. iOS app - 跳转到应用程序下载页面
  15. HBase 项目:微博业务需求
  16. 换位思考——寝室作息
  17. 【Java】JavaMail编程实现邮件客户端-OutBox InBox
  18. 手机怎么访问kodi_干货:如何使用KODI打造属于自己的娱乐媒体内容库?
  19. 数据中心容灾备份是什么?
  20. 什么是吉布斯采样(Gibbs Sampling)

热门文章

  1. 华硕电脑怎么用u盘重装系统win10
  2. 图像分割——线检测——拉普拉斯标定(Matlab)
  3. windows10计算机用户密码,怎么关闭win10系统的电脑开机密码?
  4. 盘古苹果iOS9.2-iOS9.3.3越狱Bug统计:这五点需注意
  5. R语言RStan贝叶斯示例:重复试验模型和种群竞争模型Lotka Volterra
  6. 带你解锁蓝牙skill(一)
  7. Deno 和 Fresh 入门
  8. [Excel] 条件格式-公式条件
  9. 文献翻译神器---助你轻松阅读理解英文文献论文
  10. 阿里云ECS服务器部署Node.js项目详细教程及多网站部署