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 数学成绩优异 ...
随机推荐
- 如何将list集合转成String对象
使用Stringutils中的join方法: 方法一: public String listToString(List list, char separator) { return org.apach ...
- 改名移动批量文件 shutil.copy
import glob import os import shutil filePath = 'F:/project/Breast/InBreast/INBreast/imgout/' newFile ...
- Jsoup+HttpUnit爬取搜狐新闻
怎么说呢,静态的页面,但我也写了动态的接口支持,方便后续爬取别的新闻网站使用. 一个接口,接口有一个抽象方法pullNews用于拉新闻,有一个默认方法用于获取新闻首页: public interfac ...
- luoguP4248 [AHOI2013]差异
题意 考虑式子前面那段其实是\((n-1)*\frac{n*(n+1)}{2}\),因为每个后缀出现了\(n-1\)次,后缀总长为\(\frac{n*(n+1)}{2}\). 现在考虑后面怎么求: \ ...
- C++ string push_back()
函数功能: 在后面添加一项 vector头文件的push_back函数,在vector类中作用为在vector尾部加入一个数据.string中的push_back函数,作用是字符串之后插入一个字符. ...
- Codeforces Round #573 (Div. 1)
Preface 军训终于结束了回来补一补之前的坑发现很多题目题意都忘记了 这场感觉难度适中,F由于智力不够所以弃了,E的话石乐志看了官方英文题解才发现自己已经胡了一大半就差实现了233 水平下降严重. ...
- C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档
Swifter.Json 是由本人编写的高性能且多功能的 Json 解析库.下图是 Swifter.Json 与 .Net 平台上的其他 Json 库性能对比: 在 Swifter.Json 近期更新 ...
- LeetCode 155:最小栈 Min Stack
LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- ...
- 《Spring + MyBatis 企业应用实战》书评
最近公司的前端用 MpVUE.JS 开发微信小程序遇到一个问题,对后端传来的富文本编辑器的标签无法进行解析.因为公司小,这个问题前端人员直接反映给老板,跟老板说,“ MpVUE.JS 无法解析富文本编 ...
- SEO-------- 了解
SEO(Search Engine Optimization) 译为:搜索引擎优化,是一种透过了解搜索引擎的运作规则来调整网站,以及提高目的的网站在有关搜索引擎内的排名方式. 目的:为了让用户更快的搜 ...