P2061 [USACO07OPEN]城市的地平线City Horizon

扫描线

扫描线简化版

流程(本题为例):

把一个矩形用两条线段(底端点的坐标,向上长度,添加$or$删除)表示,按横坐标排序

$upd:$本题的底端点坐标简化为$(x,0)$

蓝后对纵坐标建一棵线段树(本题需要对高度进行离散化)。

每次对线段树进行覆盖$or$删除区间操作,顺便统计一下$k=$有多少点被覆盖到

而两次(线段)操作之间的长度为$r=x_{i}-x_{i-1}$

于是两条线段之间被覆盖的面积即为$k*r$

(某退役选手又一次省出了宝贵的1.5h)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 40010
struct line{
int l,h,f;// l:横坐标 h:向上高度 f:添加/删除
line(){}
line(int A,int B,int C):
l(A),h(B),f(C){}
bool operator < (const line &tmp) const{
return l<tmp.l;
}
}a[N<<];
int x[N],n,cnt,tn,sum[N<<],tag[N<<],res;
long long ans;
#define lc o<<1
#define rc o<<1|1
#define mid l+((r-l)>>1)
void upd(int o,int l,int r,line e){
if(l>=r) return; //左端点在本题中简化成0,下同
if(x[r]<=e.h) tag[o]+=e.f;//覆盖层数增加/减少
else{
upd(lc,l,mid,e);
if(e.h>x[mid]) upd(rc,mid,r,e);//注意mid~mid+1的区间不可被忽略
}sum[o]= tag[o]? x[r]-x[l]:sum[lc]+sum[rc];//是否被完全覆盖
}
int main(){
scanf("%d",&n); int q1,q2,q3;
for(int i=;i<=n;++i){
scanf("%d%d%d",&q1,&q2,&q3);
a[++cnt]=line(q1,q3,);
a[++cnt]=line(q2,q3,-);//一个矩形用两条线段表示
x[i+]=q3;//存横坐标用于离散化
}sort(a+,a+cnt+);//(线段)操作按横坐标排序
sort(x+,x+n+);x[]=-;//注意要加上坐标(0,0)
for(int i=;i<=n+;++i)
if(x[i]!=x[i-]) x[++tn]=x[i];//离散化
upd(,,tn,a[]);
for(int i=;i<=cnt;++i){
ans+=1ll*sum[]*(a[i].l-a[i-].l);//累计两条线段间的面积
upd(,,tn,a[i]);
}printf("%lld",ans);
return ;
}

bzoj1645 / P2061 [USACO07OPEN]城市的地平线City Horizon(扫描线)的更多相关文章

  1. 线段树+扫描线【bzoj1645】[USACO07OPEN]城市的地平线City Horizon

    Description 约翰带着奶牛去都市观光.在落日的余晖里,他们看到了一幢接一幢的摩天高楼的轮廓在地平线 上形成美丽的图案.以地平线为 X 轴,每幢高楼的轮廓是一个位于地平线上的矩形,彼此间可能有 ...

  2. [题目] luogu P2061 [USACO07OPEN]城市的地平线City Horizon

    算法 线段树 + 离散化 思路 对\((x,y,h)\)的左右端点\(x,y\)进行离散化,离散化前的原值记为\(val[i]\),对每个矩形按高度\(h\)从小到大排序. 设离散化后的端点有\(M\ ...

  3. 洛谷 P2061 [USACO07OPEN]城市的地平线City Horizon

    简化版的矩形面积并,不用线段树,不用离散化,代码意外的简单 扫描线,这里的基本思路就是把要求的图形竖着切几刀分成许多矩形,求面积并.(切法就是每出现一条与y轴平行的线段都切一刀) 对于每一个切出来的矩 ...

  4. Luogu_2061_[USACO07OPEN]城市的地平线City Horizon

    题目描述 Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at the cit ...

  5. POJ 3277 City Horizon(扫描线+线段树)

    题目链接 类似求面积并..2Y.. #include <cstdio> #include <cstring> #include <string> #include ...

  6. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  7. bzoj1645 [Usaco2007 Open]City Horizon 城市地平线

    Description Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at ...

  8. 1645: [Usaco2007 Open]City Horizon 城市地平线

    1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 315  Solved: ...

  9. BZOJ_1654_[Usaco2007 Open]City Horizon 城市地平线_扫描线

    BZOJ_1654_[Usaco2007 Open]City Horizon 城市地平线_扫描线 Description N个矩形块,交求面积并. Input * Line 1: A single i ...

随机推荐

  1. kernel中文件的读写操作可以使用vfs_read()和vfs_write

    需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...

  2. uid列表来讲讲我是如何利用php数组进行排重的

    经常接到要对网站的会员进行站内信.手机短信.email进行群发信息的通知,用户列表一般由别的同事提供,当中难免会有重复,为了避免重复发送,所以我在进行发送信息前要对他们提供的用户列表进行排重. 假如得 ...

  3. HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  4. 11.20 HTML及CSS

    <div>用于分组HTML元素的块级元素HTML表单,用于收集不同类型的用户输入<input type='radio'>:定义了表单的单选框按钮<input type=' ...

  5. 【紫书】【重要】Abbott's Revenge UVA - 816 bfs 复杂模拟 带方向参数的迷宫

    题意:一个迷宫,每个交叉路口有一路标,限制了你从某方向进入该路口所能进入的路口. 题解:1.对于方向的处理:将node多增加一维dir,通过一个const 字符数组 加 上dir_id函数 以及一个方 ...

  6. angular2新建的项目上传github

    前提1.git配置好,参见博文 git常用操作 2.angular2安装配置好,这个网上有很多教程,就不多说了,参见angular2快速起步 需要注意的是,大部分问题都是网络问题. 3.新建一个ng项 ...

  7. 英特尔和 Google 的 OKR 制度与我们一般所说的 KPI 有什么不同?

    英特尔和 Google 的 OKR 制度与我们一般所说的 KPI 有什么不同? - 知乎 https://www.zhihu.com/question/22478049?sort=created 知乎 ...

  8. 不移除通知的话,出现的bug

    没销毁的私聊控制器仍然监听到了通知,发送表情

  9. 隐马尔可夫(HMM)

    https://www.zhihu.com/question/20962240 作者:Yang Eninala链接:https://www.zhihu.com/question/20962240/an ...

  10. 记录一下自己的.tmux.conf,.vimrc

    ~/.tmux.conf set -g default-terminal "screen-256color" set -g prefix C-a bind C-a send-pre ...