HDU-1542 Atlantis(离散化+扫描线)
题目大意:给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(离散化+扫描线)的更多相关文章
- (中等) HDU 1542 Atlantis,扫描线。
Problem Description There are several ancient Greek texts that contain descriptions of the fabled is ...
- HDU 1542 Atlantis(扫描线)题解
题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加. 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的.我们按照x的大小,从左往右扫,然后用线 ...
- (HDU 1542) Atlantis 矩形面积并——扫描线
n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...
- HDU 1542 Atlantis(矩形面积并)
HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- hdu 1542 Atlantis(线段树,扫描线)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- POJ 1151 HDU 1542 Atlantis(扫描线)
题目大意就是:去一个地方探险,然后给你一些地图描写叙述这个地方,每一个描写叙述是一个矩形的右下角和左上角.地图有些地方是重叠的.所以让你求出被描写叙述的地方的总面积. 扫描线的第一道题,想了又想,啸爷 ...
- HDU 1542 线段树+扫描线+离散化
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- [转]Putty中文乱码解决方法
from: http://www.putty.ws/putty-luanma putty使用的过程中,你是否遇到过putty出现中文乱码的情况呢?putty终端出现乱码,是情况,多数是由于系统或软件缺 ...
- SQL中 char、varchar、text 和 nchar、nvarchar、ntext的区别
1.char.char存储定长数据很方便,char字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间. 2.va ...
- Oracle Data Integrator与OWB的集成及迁移
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- struts2的返回类型
return 一个字符串,如果是success 直接 服务器端跳转 返回到和方法名对应的页面去 不过如果返回的页面和方法没有太大关系,比如删除修改添加之后要 客户端跳转 返回所有用户列表,这个时候可以 ...
- Oracle数据库DECODE函数的使用.
decode函数是Oracle数据库独有的. 语法为: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 例子:select decode(sign(变量1-变量2) ...
- Ubuntu 14.10 下grep命令详解
简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...
- 让多个Fragment 切换时不重新实例化、FragmentTabHost切换Fragment时避免UI重新加载
http://www.tuicool.com/articles/FJ7VBb FragmentTabHost切换Fragment时避免UI重新加载 不过,初次实现时发现有个缺陷,每次FragmentT ...
- iOS App提交指南-协议、税务和银行业务
App通过审核时,选择的是手动发布,想着等到自己生日那天来发布,当做留个纪念,结果生日当天发布时,由于App属于收费应用,还需要填写协议.税务和银行信息,结果又急急忙忙地去找了下这方面的资料,现在把整 ...
- 一个自定义的窗体样式MessageBox控件
using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Dr ...
- [转]SQLITE3 C语言接口 API 函数简介
SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sq ...