题目地址:

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. python学习:函数传参数
  2. linux网络管理技术,linux网络管理 一
  3. fortran还是python_Fortran 还有存在的必要吗?
  4. 一个Java多线程练习的调试
  5. java 栈 大小_java – JVM堆栈大小规范
  6. Z-BlogPHP海盗导航主题模板zblog5_nav
  7. Java生产者 消费者模型的一种实现
  8. 转载:图解SSL/TLS协议
  9. HDU 2181 哈密顿绕行世界问题
  10. 共空间模式算法(CSP)
  11. Ant design的Table组件报错TypeError: rawData.some is not a function
  12. 拼多多Java面试题、笔试题(含答案)
  13. mumu模拟器android调试,如何使用网易mumu模拟器调试安卓程序?
  14. C# dataGridView中插入excel表格
  15. linux关机suspending,(转)Linux 休眠原理与实现
  16. kms工具(2021.7.24更新)
  17. 基于主成分分析(PCA)的特征降维方法对葡萄酒数据集进行分类
  18. 码科速送同城跑腿小程序V2.7.4+骑手端+前端
  19. 计算机管理msc,win7系统打开计算机管理(compmgmt.msc)的操作方法
  20. 最详细的Spring+SpringMVC+Mybatis框架整合及mybatis分页讲解,适合初级者

热门文章

  1. 宏碁服务器u盘装系统,教你acer宏碁u盘重装win10
  2. 单片机工程师是程序员吗?真实的月薪到底有多少?
  3. Petsc求解一维非线性微分方程,SNES对象-2
  4. “'cookies.txt' does not look like a Set-Cookie3 (LWP) format file”和“invalid Netscape format cookies”
  5. 互联网金融入门篇(三) 专业术语
  6. CnOpenData中国各城市专利申请数量统计
  7. MATLAB中不能正常使用输入法
  8. 滴滴自动驾驶 | 基础架构如何以终为始,稳定先行?
  9. 产业园区如何解决“招商难”?明确招商思路
  10. 高阶可视化绘图系统:ggplot2入门