题目大意:给n个矩形,可能重叠,求面积。

题目分析:线段树维护扫描线。

代码如下:

# include<bits/stdc++.h>
using namespace std;
# define LL long long
# define mid (l+(r-l)/2) const int N=100000; struct Segment
{
double x1,x2,y;
bool buttom;
};
Segment seg[(N<<1)+5];
struct Node
{
double m; ///被覆盖的长度
int c; ///被完全覆盖的次数
};
Node tr[N*4+5];
double x[N*2+5];
map<double,int>mp; bool comp(const Segment &s1,const Segment &s2)
{
return s1.y<s2.y;
} void build(int rt,int l,int r)
{
tr[rt].m=0.0;
tr[rt].c=0;
if(l==r) return ;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
} void updateHere(int rt,int l,int r)
{
if(tr[rt].c>0)
tr[rt].m=x[r]-x[l-1];
else if(l==r)
tr[rt].m=0;
else tr[rt].m=tr[rt<<1].m+tr[rt<<1|1].m;
} void update(int rt,int l,int r,int L,int R,int val)
{
if(L<=l&&r<=R){
tr[rt].c+=val;
updateHere(rt,l,r);
}else{
if(L<=mid) update(rt<<1,l,mid,L,R,val);
if(R>mid) update(rt<<1|1,mid+1,r,L,R,val);
updateHere(rt,l,r);
}
} int main()
{
int n;
int cas=0;
while(~scanf("%d",&n)&&n)
{
double x1,y1,x2,y2;
for(int i=0;i<n;++i){
cin>>x1>>y1>>x2>>y2;
seg[i<<1].x1=x1,seg[i<<1].x2=x2;
seg[i<<1].y=y1;
seg[i<<1].buttom=true;
seg[i<<1|1].x1=x1,seg[i<<1|1].x2=x2;
seg[i<<1|1].y=y2;
seg[i<<1|1].buttom=false;
x[i<<1]=x1;
x[i<<1|1]=x2;
}
n<<=1;
sort(seg,seg+n,comp);
sort(x,x+n);
int len=unique(x,x+n)-x;
for(int i=0;i<len;++i)
mp[x[i]]=i;
build(1,1,len-1);
seg[2*n].y=seg[2*n-1].y;
double ans=0;
for(int i=0;i<n;++i){
int l=mp[seg[i].x1];
int r=mp[seg[i].x2];
if(seg[i].buttom)
update(1,1,len-1,l+1,r,1);
else update(1,1,len-1,l+1,r,-1);
ans+=tr[1].m*(seg[i+1].y-seg[i].y);
}
printf("Test case #%d\n",++cas);
printf("Total explored area: %.2lf\n\n",ans);
}
return 0;
}

  

HDU-1542 Atlantis(离散化+扫描线)的更多相关文章

  1. (中等) HDU 1542 Atlantis,扫描线。

    Problem Description There are several ancient Greek texts that contain descriptions of the fabled is ...

  2. HDU 1542 Atlantis(扫描线)题解

    题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加. 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的.我们按照x的大小,从左往右扫,然后用线 ...

  3. (HDU 1542) Atlantis 矩形面积并——扫描线

    n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...

  4. HDU 1542 Atlantis(矩形面积并)

    HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...

  5. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  6. HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. HDU 1542 - Atlantis - [线段树+扫描线]

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

  8. hdu 1542 Atlantis(线段树,扫描线)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. POJ 1151 HDU 1542 Atlantis(扫描线)

    题目大意就是:去一个地方探险,然后给你一些地图描写叙述这个地方,每一个描写叙述是一个矩形的右下角和左上角.地图有些地方是重叠的.所以让你求出被描写叙述的地方的总面积. 扫描线的第一道题,想了又想,啸爷 ...

  10. HDU 1542 线段树+扫描线+离散化

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. redis2.8--c/s架构流程

  2. Memcache 详解

    这里收集了经常被问到的关于memcached的问题 一般的问题 什么是memcached? 从哪获得memcached? 怎么安装memcached? 哪些平台可以运行memcached? 什么情况下 ...

  3. MATLAB图像处理函数汇总(一)

    1.applylut功能: 在二进制图像中利用lookup表进行边沿操作.语法:A = applylut(BW,lut)举例lut = makelut('sum(x(:)) == 4',2);BW1 ...

  4. 关于Json处理的两个实例

    <script> var value1="{\"layer_datum\":{\"holdId\":\"dcdm\", ...

  5. Be a person

    做人不能太实诚 尤其是干我们这行的 多久时间能做完 你自己心里要有个估算 然后把时间再往后延 别他妈给自己找罪受

  6. C++语法疑点

    1函数模板不支持偏特化 2类内部的typedef 必须放在最前面,不然没法用: 疑问:为什么类声明处定义的函数体中能出现在后面在声明的成员变量??因为C++对于成员函数函数体的解析是放在整个类声明完毕 ...

  7. Chapter 2: A Simple Servlet Container

    一.这一章从头构建一个简单的Servlet容器,可以处理Servlet和静态资源(如html文件/图片等). 要处理Servlet,必须遵循javax.servlet.Servlet规范,而处理静态资 ...

  8. 数据结构 《5》----二叉搜索树 ( Binary Search Tree )

    二叉树的一个重要应用就是查找. 二叉搜索树 满足如下的性质: 左子树的关键字 < 节点的关键字 < 右子树的关键字 1. Find(x) 有了上述的性质后,我们就可以像二分查找那样查找给定 ...

  9. JavaScript经典语录

    Js的解析与执行过程: 全局中的解析和执行过程:一:预处理:创建一个此法环境LE, 扫描JS:1.用声明的方式声明的函数(不是函数表达式),2.用var定义的变量.加到预处理阶段的此法环境中 全局环境 ...

  10. swift初识

    介绍: Swift是苹果2014年推出的全新编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程不仅保留了Objc很多语言特性,他也借鉴了多种现代化语言的特点,在其 ...