博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1542 Atlantis [离散化 + 扫描线 + 线段树]
阅读量:4563 次
发布时间:2019-06-08

本文共 1891 字,大约阅读时间需要 6 分钟。

给定平面上若干矩形,求出被这些矩形覆盖的区域的面积。

对所有矩形的 y 坐标进行离散化,然后对所有竖线段按 x 坐标排序。标记矩形左边的线段是“入边”,右边的是“出边”。从左往右扫描。对于线段 li,只要知道当前所有竖线段的长度并 H,则 li1li 区间的面积就是 H×(xixi1) ,将其加到答案中。

要高效的维护区间信息,首先想到的是线段树。然后,如果该边是“入边”,则将此边加到线段树中,否则,线段树中一定维护着这条边对应的“入边”,将它删除掉。
对于每一条“入边”,在遇到它所对应的“出边”之前,它都会影响着右边的面积,所有这些“入边”的并就是它们共同产生的影响。只要在下一条边加入之前统计出当前这部分的面积,那扫描完所有边后被这些矩形覆盖的面积就计算出来了。

还有一个问题。普通的线段树都是顶点式的,而这里要的是坐标区间式的。这有两种方法解决,一种是改变结点的闭合方式,如左闭右开,结点[l,r) 表示线段 [l,r] 。我是改变结点的表示含义,结点i 表示第 i 段线段,如结点[1,1] 表示 [0,1] 线段,即结点 [l,r] 表示线段 [l1,r] 。其实它们都一样,只是写起来不同。

#include
using namespace std;const double eps = 1e-9;#define rep(i,f,t) for(int i = (f),_end = (t); i <= _end; ++i)#define clr(c,x) memset(c,x,sizeof(c));#define MID int mid = (L+R)>>1;#define CHD int lc = node<<1,rc = node<<1|1;struct Node{ double x,y1,y2; int from,to; bool flag; Node(double xx,double yy1,double yy2,bool f) :x(xx),y1(yy1),y2(yy2),flag(f){} bool operator< (const Node &n2) const{ return x < n2.x; }};vector
vs;vector
line;const int maxn = 202<<2;struct sgt{ int cov[maxn]; double len[maxn]; void init(){ clr(cov,0); clr(len,0); } void maintain(int node,int L,int R){ if(cov[node]){ len[node] = vs[R]-vs[L-1]; }else if(L != R){ CHD; len[node] = len[lc]+len[rc]; }else{ len[node] = 0; } } double query(){ return len[1]; } void update(int from,int to,int val,int node,int L,int R){ if(from <= L && R <= to){ cov[node] += val; }else{ MID;CHD; if(from <= mid)update(from,to,val,lc,L,mid); if(to > mid) update(from,to,val,rc,mid+1,R); } maintain(node,L,R); }}tree;bool equ(double x,double y){ return fabs(x-y)

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/DSChan/p/4861976.html

你可能感兴趣的文章
解剖 CPU
查看>>
404 Note Found 队-课堂实战-项目UML设计
查看>>
HTTP协议(收藏)
查看>>
(原创)如何获取网页URL的source code (Android)
查看>>
JavaScript之函数作用域
查看>>
仿迅雷播放器教程 -- C++界面制作方法的对比 (9)
查看>>
近期计划
查看>>
解决DFS Locations从Eclipse的Navigator中消失的问题
查看>>
Vue搭建项目
查看>>
java学习笔记《一》网络编程基础
查看>>
设计模式
查看>>
mysqld_safe A mysqld process already exists
查看>>
六年测试之精华分享:产品质量应从哪些方面提高
查看>>
文件处理
查看>>
for循环
查看>>
【转】Android手机客户端关于二维码扫描的源码--不错
查看>>
【转】Java 多线程(四) 多线程访问成员变量与局部变量
查看>>
【转】gcc warning: braces around scalar initializer (标量初始化的括号)
查看>>
C/C++内存泄漏及检测(vs2005平台)【转】
查看>>
SpringBoot中遇到的问题---【Whitelabel Error Page 404 spring boot解决方法】
查看>>