| 线段树-地平线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 ...
随机推荐
- 模组 前后端分离CURD 组件
js (function () { // {# -------------------------------------------------------------------------- # ...
- 菜鸟博客装饰分享CSS+HTML+js
博客布局更改,各种百度,自己修改,搞成现在这样,有兴趣的朋友可以复制我下面的把自己博客覆盖了,然后在进行更改 不懂可加群问我:675678830 如果想开通打赏,用到js,需要在 下列中 博客侧边栏公 ...
- python celery任务分发
<div id="cnblogs_post_body" class="blogpost-body"><p>Celery是由Python开 ...
- JAVA中几种常用的RPC框架介绍
原文:https://blog.csdn.net/zhaowen25/article/details/45443951
- Gin 路由解析树详解
说明: 无意间看到gin 中有trees的属性,好奇想一探究竟,到底gin是怎样生成路由解析树的? 这是一个测试截图,图中大概可以了解到gin是怎样做路由解析的.配合源码的阅读,解析树大致如下: 通过 ...
- SpringBoot整合mybatis多数据源,支持分布式事务
编码工具:IDEA SpringBoot版本:2.0.1 JDK版本:1.8 1.使用IDEA构建一个Maven工程 ,添加依赖: <?xml version="1.0" e ...
- 错误: Error creating bean with name 'studentController': Unsatisfied dependency expressed through field 'studentServiceImpl';
详细错误: 严重: Context initialization failed org.springframework.beans.factory.UnsatisfiedDependencyExcep ...
- 微信支付的安全漏洞之XXE
1.场景:国外安全社区公布微信支付官方SDK存在严重漏洞,可导致商家服务器被入侵(绕过支付的效果).目前,漏洞详细信息以及攻击方式已被公开,影响范围巨大(已确认陌陌.vivo因使用该SDK而存在该漏洞 ...
- table切换jquery插件 jQuery插件写法模板 流程
通过$.extend()来扩展jQuery 通过$.fn 向jQuery添加新的方法 通过$.widget()应用jQuery UI的部件工厂方式创建 通过$.extend()来扩展jQuery $. ...
- n 个骰子的点数
把 n 个骰子仍在地上,求点数和为 s 的概率. java: public List<Map.Entry<Integer, Double>> dicesSum(int n) { ...