原题链接: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 坐标,两个数之间用空格分开。

输入输出样例

输入 #1
1 11 5
2 6 7
3 13 9
12 7 16
14 3 25
19 18 22
23 13 29
24 4 28
输出 #1
1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0

题解

矩形面积并的代码一码三用……

把横向排列的矩形反转一下,就可以套用之前的模型:

同时因为矩形左边在同一竖直线上,所以任意时刻的截线都只会是一根完整的线段,我们直接统计被覆盖线段的总长就行了。

当出现有重合的边的时候,记得把所有重合边都添加/删去完再进行统计,一下是一组测试数据:

1 2 2
1 1 2

代码

为了方便边界处理,人为的规定所有边的左端点横坐标为111。

#include<bits/stdc++.h>
#define ls v<<1
#define rs v<<1|1
using namespace std;
const int M=5005;
struct Edge{int le,ri,h,val;
}edge[M<<1];
bool cmp(Edge a,Edge b){return a.h<b.h;}
struct node{int le,ri,len,cov;
}tree[M<<2];
int n,tot,x[M],cot,ans[M];
void up(int v){tree[v].len=tree[v].cov?tree[v].ri-tree[v].le:tree[ls].len+tree[rs].len;}
void build(int v,int le,int ri)
{tree[v].le=x[le],tree[v].ri=x[ri+1];if(le==ri)return;int mid=le+ri>>1;build(ls,le,mid),build(rs,mid+1,ri);
}
void cover(int v,int le,int ri,int val)
{if(le<=tree[v].le&&tree[v].ri<=ri){tree[v].cov+=val;up(v);return;}if(le<tree[ls].ri)cover(ls,le,ri,val);if(tree[rs].le<ri)cover(rs,le,ri,val);up(v);
}
void in()
{x[++tot]=1;for(int a,b,c;~scanf("%d%d%d",&a,&b,&c);++n)edge[++cot]=(Edge){1,b+1,a,1},edge[++cot]=(Edge){1,b+1,c,-1},x[++tot]=b+1;
}
void ac()
{sort(x+1,x+1+tot);tot=unique(x+1,x+1+tot)-x-1;build(1,1,tot-1);sort(edge+1,edge+1+cot,cmp);//for(int i=1;i<=cot;++i)printf("%d %d %d %d\n",edge[i].le,edge[i].ri,edge[i].h,edge[i].val);for(int i=1,pre=0;i<=cot;++i){for(;edge[i].h==edge[i+1].h;++i)cover(1,edge[i].le,edge[i].ri,edge[i].val);cover(1,edge[i].le,edge[i].ri,edge[i].val);if(tree[1].len!=pre)printf("%d %d ",edge[i].h,tree[1].len),pre=tree[1].len;}
}
int main()
{in(),ac();system("pause");
}

Luogu1904 天际线相关推荐

  1. [Swift]LeetCode218. 天际线问题 | The Skyline Problem

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  2. 【解题报告】Leecode 807. 保持城市天际线——Leecode每日刷题系列

    题目链接:https://leetcode-cn.com/problems/max-increase-to-keep-city-skyline/ 题解汇总:https://leetcode-cn.co ...

  3. leetcode 218. 天际线问题

    城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓.给你所有建筑物的位置和高度,请返回由这些建筑物形成的 天际线 . 每个建筑物的几何信息由数组 buildings 表示,其中三元组 bu ...

  4. LeetCode 218. 天际线问题(multiset优先队列)*

    文章目录 1. 题目 2. 解题 1. 题目 城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓. 现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输 ...

  5. LeetCode 807. 保持城市天际线

    文章目录 1. 题目 2. 解题 1. 题目 在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度. 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度. 高度 0 也被 ...

  6. 城市天际线 android,都市天际线安卓手机版

    <都市天际线安卓手机版>是一款十分火爆的模拟经营类经典手游,在游戏中玩家们都是可以进行自由自在的建设城市,可以说在这里建设一个城市是非常简单的,但是如何才能更好地发展整个城市,那就需要不断 ...

  7. python吃显卡还是内存条_玩天际线吃U还是吃显卡或者还是吃内存?--天际线配置需求个人见解...

    作为一个天际线的伪萌新,经常能听到天际线的朋友各种问"求各位吧友,群友,水友,基友,我电脑CPU i7XXXX, 内存 XXG,显卡 GTX10XX,能否带的动天际线?" 每当看到 ...

  8. l360清零软件无响应_张店楼顶商业广告全面“清零”!城市“天际线”颜值再刷新...

    历时82天,拆除大型广告牌.字1558处,张店楼顶商业广告全面"清零"!城市"天际线"颜值再刷新. 为打造焕然一新的城乡环境面貌,彻底清除高空楼顶广告这个一直悬 ...

  9. 807. 保持城市天际线

    链接:807. 保持城市天际线 题解: class Solution { public:int maxIncreaseKeepingSkyline(vector<vector<int> ...

  10. Leetcode 218.天际线问题

    天际线问题 城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓.现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线(图B). ...

最新文章

  1. (九)单片机串行口 内部结构的讲解 01
  2. 一道有关动态规划(Dynamic Programming)的网易面试题
  3. gta5显示nat较为严格_报告显示,中国超七成企业正在使用灵活用工
  4. linux某些汉字乱码,Linux汉字乱码解决办法
  5. nginx相关知识点
  6. 马秀丽C语言程序设计答案pdf,C语言程序设计清华大学马秀丽刘志妩科后习题9答案.doc...
  7. Centos7:mysql5.6安装,配置及使用(RPM方式)
  8. 新人起步,扬帆起航!
  9. 输入和用户界面——总结
  10. 大数据的关键不是“大”,而是你真的需要它吗
  11. 【新发现】不用苹果开发账号就能申请ios证书真机调试
  12. vue 富文本编辑器wangeditor 上传图片
  13. DataGear 自定义数据可视化图表
  14. php游戏实例,php实现的简易扫雷游戏实例_PHP
  15. FFmpeg视频录制(WIN)
  16. 主流的企业级虚拟化解决方案
  17. 为期两年的研究揭示了Android的大问题
  18. JAVA开发明源云面经(已OC)
  19. RESTful API接口设计标准及规范;
  20. 2022G2电站锅炉司炉考试题及在线模拟考试

热门文章

  1. 每日一题/003/微积分/极限问题转化为定积分的定义
  2. 647.回文字符串 (力扣leetcode) 博主可答疑该问题
  3. 347.前K个高频元素(力扣leetcode) 博主可答疑该问题
  4. java设计模式----代理模式
  5. Android TeaPickerView数据级联选择器
  6. 上周热点回顾(11.27-12.3)
  7. [PHP] excel 的导入导出
  8. 解决Eclipse10配置Pydev不成功的问题
  9. 快速构建Windows 8风格应用9-竖直视图
  10. 从源码理解Bean的生命周期执行顺序