| 线段树-地平线horizon
【题目描述】:在地平线上有n个建筑物。每个建筑物在地平线上可以看成一个下边界和地平线重合的矩形。每个建筑物有三个描述(Li ,Ri,Hi),分别表示该建筑物的左边界,右边界,高度。输出输出这些建筑物在地平线上投影的总面积。
【输入文件】
输入文件horizon.in第一行包含一个整数n,表示有n个建筑物。
以下下n.行,每行三个整数Li ,Ri,Hi。
【输出文件】
输出这些建筑物在地平线上投影的总面积
【样例】
horizon.in horizon.out 4
2 5 1
9 10 4
6 8 2
4 6 3
16
【限制】
100%的数据满足:1<=n<=40,000
1 ≤ Li < Ri ≤ 1,000,000,000
1 ≤ Hi ≤ 1,000,000,000
区间问题容易想到线段树解决。最开始想枚举每个区间最左和最右两个矩形的位置关系(相离、相切、相交、内含)并在建树时即统计面积,但在写的发现很难实现…
正解是区间修改,每加入一个矩形,就二分找到它所覆盖的区间,并改变该区间的覆盖高度
在建树时注意因为矩形边长>=1,右界需要取中点,且叶子节点的左右端点相差为1;
此题的考点:
1、区间中需要处理的点稀疏而区间很长时,需要离散化(矩形的端点只有80000个,区间长10亿);
2、区间修改操作;
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int ans,t;
struct node{
int left,right;
int c;
}tree[*];
struct edge{
int left,right,h;
}a[];
int p[*];
bool cmp(edge e1,edge e2)
{
return e1.h<e2.h;
}
int erfen(int l,int r,int x)
{
while(l<=r)
{
int mid=(l+r)/;
if(p[mid]==x) return mid;
else if(p[mid]>x) r=mid-;
else l=mid+;
}
return ;
}
void change(int now,int l,int r,int x)
{
if(tree[now].right<l||tree[now].left>r) return;
if(tree[now].left>=l&&tree[now].right<=r)
{
tree[now].c=x;
return;
}
int mid=(tree[now].left+tree[now].right)/;
if(tree[now].c) {
tree[now*].c=tree[now].c;
tree[now*+].c=tree[now].c;
tree[now].c=;
} if(mid>=r) change(now*,l,r,x);
else if(mid<=l) change(now*+,l,r,x);
else {
change(now*,l,r,x); change(now*+,l,r,x);
}
}
void built(int now,int l,int r)
{
tree[now].left=l;
tree[now].right=r;
tree[now].c=;
if(l==r-) return;
built(now*,l,(l+r)/);
built(now*+,(l+r)/,r);//*****右界要包括mid
}
void quest(int now)
{
if(tree[now].c)
{
ans+=(p[tree[now].right]-p[tree[now].left])*tree[now].c;
return;
}
if(tree[now].right==tree[now].left+) return;
quest(now*);
quest(now*+);
}
int main()
{
freopen("horizon.in","r",stdin);
freopen("horizon.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&a[i].left,&a[i].right,&a[i].h);
p[++t]=a[i].left;
p[++t]=a[i].right;
}
sort(p+,p++*n);
sort(a+,a+n+,cmp);
built(,,n*);
for(int i=;i<=n;i++)
{
int l=erfen(,*n,a[i].left);
int r=erfen(,*n,a[i].right);
change(,l,r,a[i].h);
}
quest();
printf("%d",ans);
}
| 线段树-地平线horizon的更多相关文章
- 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
[BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...
- 【BZOJ】1645: [Usaco2007 Open]City Horizon 城市地平线(线段树+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1645 这题的方法很奇妙啊...一开始我打了一个“离散”后的线段树.............果然爆了. ...
- bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】
bzoj题面什么鬼啊-- 题目大意:有一个初始值均为0的数列,n次操作,每次将数列(ai,bi-1)这个区间中的数与ci取max,问n次后元素和 离散化,然后建立线段树,每次修改在区间上打max标记即 ...
- [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 线段树
链接 题意:N个矩形块,交求面积并. 题解 显然对于每个 \(x\),只要求出这个 \(x\) 上面最高的矩形的高度,即最大值 将矩形宽度离散化一下,高度从小到大排序,线段树区间set,然后求和即可 ...
- 离散化+线段树 POJ 3277 City Horizon
POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...
- poj City Horizon (线段树+二分离散)
http://poj.org/problem?id=3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissi ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- [POJ] 3277 .City Horizon(离散+线段树)
来自这两篇博客的总结 http://blog.csdn.net/SunnyYoona/article/details/43938355 http://m.blog.csdn.net/blog/mr_z ...
- POJ 3277 City Horizon(叶子节点为[a,a+1)的线段树+离散化)
网上还有用unique函数和lowerbound函数离散的方法,可以百度搜下题解就有. 这里给出介绍unique函数的链接:http://www.cnblogs.com/zhangshu/archiv ...
随机推荐
- react-router(v4) 路由跳转后返回页面顶部问题
遇到的问题 由A页面跳转到B页面,B页面停留在A页面的位置,没有返回到顶部. 问题分析 首先分析下出现此问题的原因: 在项目中使用的是 hashHistory,它是建立在 history 之上的,当路 ...
- 《尚学堂_史上最易懂的设计模式视频》--章节5 动态代理-JDK6自带的编译器
所有的设计模式中最难的一个 ==组合和聚合是有很大区别的 组合和聚合是有很大区别的,这个区别不是在形式上,而是在本质上: 比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象 ...
- 简易解说拉格朗日对偶(Lagrange duality)
引言:尝试用最简单易懂的描述解释清楚机器学习中会用到的拉格朗日对偶性知识,非科班出身,如有数学专业博友,望多提意见! 1.原始问题 假设是定义在上的连续可微函数(为什么要求连续可微呢,后面再说,这里不 ...
- PostgreSQL快速入门
一.PostgreSQL是什么? PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQ ...
- JAVA 数组元素的反转
package Code411;/*数组元素的反转本来[1,2,3,4]反转后[4,3,2,1]1.对称位置的元素交换2.对称位子需要两个索引3.int temp =a:a=b;b=temp;4.什么 ...
- 还在期待安卓9.0吗?Android 10.0要来了
目前,美国 Google公司的 AndroidP (安卓9.0),已经正式全面推出有几个多月了.众多手机品牌厂商也都在积极的进行更新适配 Android 9.0 系统(修改UI界面也算是二次开发,嗯) ...
- PID控制器开发笔记之十二:模糊PID控制器的实现
在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题.模糊PID控制器是将模糊算法与PID控 ...
- windows下的node环境搭建
node环境的搭建过程: 1.首先在nodejs.org官网上下载一个msi安装文件,安装(过程很简单,基本上是一路next) 2.安装完成后,简单测试下是否安装成功,在cmd下输入两个命令: nod ...
- mac svn无法保存密码,JetBrains IDE(WebStrom、IntelliJ IDEA) 反复提示输入密码
一.vim ~/.subversion/config用vim修改以下四个地方store-passwords = yesstore-plaintext-passwords = yesstore-ssl- ...
- Python学习笔记六
Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...