UVALive - 4108 SKYLINE[线段树]
UVALive - 4108
Description
The skyline of Singapore as viewed from the Marina Promenade (shown on the left) is one of the iconic scenes of Singapore. Country X would also like to create an iconic skyline, and it has put up a call for proposals. Each submitted proposal is a description of a proposed skyline and one of the metrics that country X will use to evaluate a proposed skyline is the amount of overlap in the proposed sky-line. As the assistant to the chair of the skyline evaluation committee, you have been tasked with determining the amount of overlap in each proposal. Each proposal is a sequence of buildings, The skyline formed by the first k <tex2html_verbatim_mark>buildings is the union of the rectangles of the first k <tex2html_verbatim_mark>buildings (see Figure 4). The overlap of a building, bi <tex2html_verbatim_mark>, is defined as the total horizontal length of the parts of bi <tex2html_verbatim_mark>, whose height is greater than or equal to the skyline behind it. This is equivalent to the total horizontal length of parts of the skyline behind bi<tex2html_verbatim_mark>which has a height that is less than or equal to hi <tex2html_verbatim_mark>, where hi <tex2html_verbatim_mark>is the height of building bi <tex2html_verbatim_mark>. You may assume that initially the skyline has height zero everywhere. Input The input consists of a line containing the number c <tex2html_verbatim_mark>of datasets, followed by c <tex2html_verbatim_mark>datasets, followed by a line containing the number ` 0'. The first line of each dataset consists of a single positive integer, n <tex2html_verbatim_mark>(0 < n < 100000) <tex2html_verbatim_mark>, which is the number of buildings in the proposal. The following n<tex2html_verbatim_mark>lines of each dataset each contains a description of a single building. The i <tex2html_verbatim_mark>-th line is a description of building bi <tex2html_verbatim_mark>. Each building bi <tex2html_verbatim_mark>is described by three positive integers, separated by spaces, namely, li <tex2html_verbatim_mark>, ri <tex2html_verbatim_mark>and hi <tex2html_verbatim_mark>, where li <tex2html_verbatim_mark>and rj <tex2html_verbatim_mark>(0 < li < ri Output The output consists of one line for each dataset. The c <tex2html_verbatim_mark>-th line contains one single integer, representing the amount of overlap in the proposal for dataset c<tex2html_verbatim_mark>. You may assume that the amount of overlap for each dataset is at most 2000000. Note: In this test case, the overlap of building b1 <tex2html_verbatim_mark>, b2 <tex2html_verbatim_mark>and b3 <tex2html_verbatim_mark>are 6, 4 and 4 respectively. Figure 4 shows how to compute the overlap of building b3 <tex2html_verbatim_mark>. The grey area represents the skyline formed by b1 <tex2html_verbatim_mark>and b2 <tex2html_verbatim_mark>and the black rectangle represents b3 <tex2html_verbatim_mark>. As shown in the figure, the length of the skyline covered by b3 <tex2html_verbatim_mark>is from position 3 to position 5 and from position 11 to position 13, therefore the overlap of b3 <tex2html_verbatim_mark>is 4. Sample Input 1 Sample Output 14 |
题意:在线区间[l,r]查询h是最大值的长度,并更新
很明显区间max
但怎么找这个长度overlap呢?
如果当前区间满足ql<=l&&r<=qr&&h>=t[o].mx 那么就可以被完全覆盖
用lazy维护区间完全覆盖中的最大值,h<t[o].lazy时就不用继续找了(因为h不可能覆盖这个区间了),有点像个剪枝
否则必须继续找,下传lazy(无需清空自己的标记,剪枝嘛),合并mx
lazy和mx还有点小细节,比如paint没有用lazy更新mx,其实这不影响,因为先if(h<t[o].lazy) return;了
注意点是区间[i,i+1]
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define m (l+r)/2
#define lson o<<1,l,m
#define rson o<<1|1,m+1,r
#define lc o<<1
#define rc o<<1|1
using namespace std;
typedef long long ll;
const int N=1e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int T,n,ql,qr,h;
struct node{
int mx,lazy;//totally cover
}t[N<<];
inline void pushDown(int o){
if(t[o].lazy>t[lc].lazy) t[lc].lazy=t[o].lazy;
if(t[o].lazy>t[rc].lazy) t[rc].lazy=t[o].lazy;
}
int lap=;
inline void update(int o,int l,int r,int ql,int qr,int h){
if(h<t[o].lazy) return;
if(ql<=l&&r<=qr&&h>=t[o].mx){
t[o].mx=t[o].lazy=h;
lap+=r-l+;
}else{
pushDown(o);
if(ql<=m) update(lson,ql,qr,h);
if(m<qr) update(rson,ql,qr,h);
t[o].mx=max(t[lc].mx,t[rc].mx);
}
} int main(){
T=read();
while(T--){
n=read();
int ans=;
memset(t,,sizeof(t));
for(int i=;i<=n;i++){
ql=read();qr=read()-;h=read();
lap=;
update(,,1e5,ql,qr,h);
//printf("lap %d\n",lap);
ans+=lap;
}
printf("%d\n",ans);
}
}
UVALive - 4108 SKYLINE[线段树]的更多相关文章
- UVALive - 4108 SKYLINE (吉司机线段树)
题目链接 题意:在一条直线上依次建造n座建筑物,每座建筑物建造完成后询问它在多长的部分是最高的. 比较好想的方法是用线段树分别维护每个区间的最小值mi和最大值mx,当建造一座高度为x的建筑物时,若mi ...
- UVA 1232 - SKYLINE(线段树)
UVA 1232 - SKYLINE option=com_onlinejudge&Itemid=8&page=show_problem&category=502&pr ...
- 2018牛客网暑假ACM多校训练赛(第四场)E Skyline 线段树 扫描线
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-E.html 题目传送门 - https://www.no ...
- UVaLive 11525 Permutation (线段树)
题意:有一个由1到k组成的序列,最小是1 2 … k,最大是 k k-1 … 1,给出n的计算方式,n = s0 * (k - 1)! + s1 * (k - 2)! +… + sk-1 * 0!, ...
- UVALive - 3938 (线段树,区间查询)
思路:详细分析见训练指南.注意可能答案的起点在左区间,终点在右区间 AC代码 #include <stdio.h> #include <algorithm> using nam ...
- LA 4108 (线段树)
区间更新 + 统计更新长度 稍稍不注意就T了 #include<bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1 ...
- UVA1232 - SKYLINE(段树部分的变化)
UVA1232 - SKYLINE(线段树区间改动) 题目链接 题目大意:依照顺序盖楼.假设这个位置(当前要盖的楼覆盖范围内)要新建的楼的高度>=之前就有的最大高度,那么就+1.最后输出这个+1 ...
- 数据结构习题 线段树&树状数组
说明:这是去年写了一半的东西,一直存在草稿箱里,今天整理东西的时候才发现,还是把它发表出来吧.. 以下所有题目来自Lrj的<训练指南> LA 2191 单点修改,区间和 Fenwick直 ...
- 2017西安区域赛A / UVALive - 8512 线段树维护线性基合并
题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 本题是2017的西安区域赛A题,了解线性基之后你会发现这根本就是套路题.. 只要用线段 ...
随机推荐
- php strtotime 在32位操作系统下的限制
php strtotime 在32位操作系统下的限制 <?php class DateHelper{ /** * 在32位操作系统下,超过 2038-01-19 03:14:07 ,会溢出 * ...
- luogg_java学习_07_抽象类_接口_多态学习总结
这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 抽象 一种专门用来做父类,被继承的. (模板) 格式: abs ...
- 如何在windows下的Python开发工具IDLE里安装其他模块?
以安装Httplib2模块为例 1 下载模块 到 “https://code.google.com/p/httplib2/” 下载一款适合你的压缩包“httplib2-0.4.0.zip” 2 解压下 ...
- 兼容 IE input button 左右内边距的增加
IE 下的按钮标签(input.button)会随着文字的增加导致文本左右两侧的间距越来越大.该问题存在于 IE6/IE7,IE8~IE10 没发现类似问题.一般情况下,只要给按钮标签设置 overf ...
- 如何正确响应ArcGIS JavaScript API中图形的鼠标事件
在使用ArcGIS JavaScript API编写程序的时候,程序员往往需要完成这样一个功能:点击地图上的图形,自动进行专题GIS数据查询,当在地图非图形区域上点击时,自动进行底图兴趣点查询. 由于 ...
- iOS开发-UI 从入门到精通(三)
iOS开发-UI 从入门到精通(三)是对 iOS开发-UI 从入门到精通(一)知识点的综合练习,搭建一个简单地登陆界面,增强实战经验,为以后做开发打下坚实的基础! ※在这里我们还要强调一下,开发环境和 ...
- windows下安装web服务器
有条件下还是在linux下部署.window上真心问题挺多的. 推荐安装Visual-NMP,轻量级.组件升级方面等. Nginx绑定IPv4和IPv6的方法 listen 80; listen [: ...
- IOS开发基础知识--碎片4
十七:返回到主线程进行操作,对UI进行更新只能在主线程进行 /*将数据显示到UI控件,注意只能在主线程中更新UI, 另外performSelectorOnMainThread方法是NSObject的分 ...
- GIT命令行的使用
新手了解 有不对的地方指点下 首先, 了解下什么是GIT,GIT是一款开元的分布式版本控制工具, 在世界上的所有分布式版本控制工具中,GIT是最简单,最流行,同时也是最常用的 相比于其他版本的控制工具 ...
- IOS网络请求的一些需要记录的info设置
info.plist文件: <key>NSExceptionDomains</key> <dict> <key>appapi.700bike.com&l ...
uDebug