luogu P1904 天际线
分析
都知道是从左向右扫描
可是该维护什么,扫描什么?
注意想想怎么输出, 实际上它要的输出就是图形的轮廓,即每个突出块的左上节点的x,y
所以说, 我们可以把扫描线扫进的楼房放入线段树,扫出的楼房删去(也就是把它高度清零)
然后维护线段树内的最大值
( 为什么这样想呢: 因为要输出的是轮廓,所以我们这样维护后,既可以在在高度突变时及时输出答案,
又不会受到以前楼房的高度的影响)
思考后有需要请看
细节详见代码&注释
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 5000+9
int id, lastt, m;
struct node{
int x, h, id;//id后面有用
bool operator < (const node& xxx) const {
return x < xxx.x;
}
}a[MAX<<2];
int mx[MAX<<2];
void build(int o, int l, int r) {
if(l == r) {mx[o] = 0; return ;}
int mid = (l+r)>>1;
build(o<<1, l, mid);
build(o<<1|1, mid+1, r);
mx[o] = 0;//应该是因为没有扫,所以是0
}
void update(int o,int l, int r, int t, int v) {
if(l == r) {
mx[o] = v;
return ;
}
int mid = (l+r)>>1;
if(t <= mid) update(o<<1, l, mid, t, v);
else update(o<<1|1, mid+1, r, t, v);
mx[o] = max(mx[o<<1] , mx[o<<1|1]);
}
int main() {
int l,h,r;
while(scanf("%d%d%d",&l,&h,&r)!=EOF)
{
id++;
a[++m].x=l,a[m].h=h,a[m].id=id;
a[++m].x=r,a[m].h=-h,a[m].id=id;//扫描线用正负表示进出
}
sort(a+1, a+m+1);
build(1, 1, id);
for(int i = 1; i <= m; i++) {
if(a[i].h > 0) update(1, 1, id, a[i].id, a[i].h);
else update(1, 1, id, a[i].id, 0);
if(a[i].x != a[i+1].x ) {//如果这个点处理完了才继续执行...为了防止在处理两个并排的不一样高的楼房时(假设左边低一点),
// 交点没有处理完, 导致last改变为0, 导致错解
if(lastt != mx[1] ) printf("%d %d ", a[i].x , mx[1]);//只输出第一个改变点的x和y
lastt = mx[1];//更新最高值, 用于判断转折点
}
}
return 0;
}
luogu P1904 天际线的更多相关文章
- [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)
前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...
- [LeetCode] The Skyline Problem 天际线问题
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
- [luogu P2647] 最大收益(贪心+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...
- Luogu 考前模拟Round. 1
A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...
- luogu P2580 于是他错误的点名开始了
luogu P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...
- CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...
随机推荐
- Java HashMap用法
为了做题用Java语法替代C++map的常用语法,记录一下,剖析原理以后再补上. 1.import java.util.HashMap;//导入; 2.HashMap<K, V> map= ...
- 【CF525E】Anya and Cubes(meet in middle)
点此看题面 大致题意: 在\(n\)个数中选任意个数,并使其中至多\(k\)个数\(x_i\)变为\(x_i!\),求使这些数和为\(S\)的方案数. \(meet\ in\ middle\) 这应该 ...
- A1029 Median (25 分)
一.技术总结 最开始的想法是直接用一个vector容器,装下所有的元素,然后再使用sort()函数排序一下,再取出中值,岂不完美可是失败了,不知道是容器问题还是什么问题,就是编译没有报错,最后总是感觉 ...
- 校园邮箱注册jetbrains全家桶遇到的问题
校园邮箱怎么注册jetbrains账号,百度就可以,发两次邮件 我遇到的问题: 1.登录时出现connection refused 因为之前都是破解使用,所以修改过hosts文件,添加了“0.0.0. ...
- 【目录】洛谷|CODEVS题解汇总
[动规]爱与愁的心痛 [动规]编辑距离 [动规]采药 [动规]创意吃鱼法 [动规]过河卒 [动规]开心的金明 [动规]旅行 [动规]骑士游历 [动规]数字三角形 [动规]最长连号 [动规]装箱问题 [ ...
- LeetCode 61:旋转链表 Rotate List
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. Given a linked list, rotate the list to the right by k pla ...
- 【Linux命令】Linux压缩及解压命令
Linux压缩及解压命令 一.文件打包和压缩命令介绍 linux系统文件压缩格式,常用的有*.tar.gz.*.gz.*.zip.*.tar,还有*.rar..7z..bz2..tar.xz..tar ...
- python批量裁剪图片
"""用Pythonp批量裁剪图片""" from PIL import Imageimport matplotlib.pyplot as ...
- ML.NET调用Tensorflow模型示例——MNIST
ML.NET在不久前发行了1.0版本,在考虑这一新轮子的实际用途时,最先想到的是其能否调用已有的模型,特别是最被广泛使用的Tensorflow模型.于是在查找了不少资料后,有了本篇示例.希望可以有抛砖 ...
- centos ftp服务器搭建 vsftpd 匿名访问配置方法 ftp 550 Failed to open file 错误处理
vsftpd是linux下常用的ftp服务软件,配置起来其实不复杂,只是网上很多文章,配置后都无法成功.我使用它是用于局域网内部分享文件的,所以使用匿名的方式. ftp本身密码是明文传输的,如果需要安 ...