(中等) HDU 1542 Atlantis,扫描线。
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of Atlantis. Your friend Bill has to know the total area for which maps exist. You (unwisely) volunteered to write a program that calculates this quantity.
题目就是求矩形并的面积,具体请看 线段树 (扫描线) 这篇文章。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> #define lson L,M,lc
#define rson M+1,R,rc
#define lc po*2
#define rc po*2+1 using namespace std; struct BIAN
{
double x,y1,y2;
int state;
}; BIAN bian[];
double hash[];
double BIT[*];
int COL[*];
int COU; bool cmp(BIAN a,BIAN b)
{
return a.x<b.x;
} int find(double x)
{
int L=,R=COU;
int M; while(R>L)
{
M=(L+R)/; if(fabs(hash[M]-x)<0.000001)
return M; if(hash[M]<x)
L=M+;
else
R=M-;
} return L;
} void pushUP(int L,int R,int po)
{
if(COL[po])
BIT[po]=hash[R+]-hash[L];
else if(L==R)
BIT[po]=;
else
BIT[po]=BIT[lc]+BIT[rc];
} void update(int ul,int ur,int ut,int L,int R,int po)
{
if(ul<=L&&ur>=R)
{
COL[po]+=ut; if(COL[po]>)
BIT[po]=hash[R+]-hash[L];
else if(L==R)
BIT[po]=;
else
pushUP(L,R,po); return;
} int M=(L+R)/; if(ul<=M)
update(ul,ur,ut,lson);
if(ur>M)
update(ul,ur,ut,rson); pushUP(L,R,po);
} int main()
{
int cas=;
int N;
double x1,x2,y1,y2;
double ans; for(cin>>N;N;cin>>N)
{
ans=;
COU=;
memset(hash,,sizeof(hash));
memset(COL,,sizeof(COL));
memset(BIT,,sizeof(BIT)); for(int i=;i<=N;++i)
{
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); bian[i*-].x=x1;
bian[i*-].y1=y1;
bian[i*-].y2=y2;
bian[i*-].state=; bian[i*].x=x2;
bian[i*].y1=y1;
bian[i*].y2=y2;
bian[i*].state=-; hash[COU++]=y1;
hash[COU++]=y2;
} sort(hash+,hash+COU);
sort(bian+,bian+*N+,cmp); int k=;
for(int i=;i<COU;++i)
if(hash[i]!=hash[i-])
hash[k++]=hash[i];
COU=k-; for(int i=;i<=*N;++i)
{
ans+=BIT[]*(bian[i].x-bian[i-].x); update(find(bian[i].y1),find(bian[i].y2)-,bian[i].state,,COU-,);
} ans+=BIT[];
printf("Test case #%d\nTotal explored area: %.2f\n\n",++cas,ans);
} return ;
}
代码改了一下的:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> #define lc po*2
#define rc po*2+1
#define lson L,M,lc
#define rson M+1,R,rc
#define ji i*2-1
#define ou i*2 using namespace std; struct BIAN
{
double x,y1,y2;
short state;
}; const int maxn=; BIAN bian[maxn];
double BIT[maxn*];
int COL[maxn*];
double hash[maxn];
int COU; int find(double x)
{
int L=,R=COU,M; while(R>L)
{
M=(L+R)/; if(fabs(x-hash[M])<0.0000001)
return M; if(hash[M]<x)
L=M+;
else
R=M-;
} return L;
} void callUP(int L,int R,int po)
{
if(COL[po])
BIT[po]=hash[R+]-hash[L];
else if(L==R)
BIT[po]=;
else
BIT[po]=BIT[lc]+BIT[rc];
} void pushUP(int L,int R,int po)
{
int temp=min(COL[lc],COL[rc]); COL[po]+=temp;
COL[lc]-=temp;
COL[rc]-=temp; callUP(L,(L+R)/,lc);
callUP((L+R)/+,R,rc); callUP(L,R,po);
} void pushDown(int L,int R,int po)
{
if(COL[po])
{
COL[lc]+=COL[po];
COL[rc]+=COL[po]; callUP(L,(L+R)/,lc);
callUP((L+R)/+,R,rc); callUP(L,R,po); COL[po]=;
}
} void update(int ul,int ur,int ut,int L,int R,int po)
{
if(ul<=L&&ur>=R)
{
COL[po]+=ut;
pushUP(L,R,po); return;
} pushDown(L,R,po); int M=(L+R)/; if(ul<=M)
update(ul,ur,ut,lson);
if(ur>M)
update(ul,ur,ut,rson); pushUP(L,R,po);
} bool cmp(BIAN a,BIAN b)
{
return a.x<b.x;
} int main()
{
int N;
int cas=;
double ans;
double x1,x2,y1,y2; ios::sync_with_stdio(false);
cout.setf(ios::fixed);
cout.precision(); for(cin>>N;N;cin>>N)
{
memset(BIT,,sizeof(BIT));
memset(COL,,sizeof(COL)); for(int i=;i<=N;++i)
{
cin>>x1>>y1>>x2>>y2; hash[ji]=y1;
hash[ou]=y2; bian[ji].state=;
bian[ou].state=-; bian[ji].x=x1;
bian[ou].x=x2; bian[ji].y1=bian[ou].y1=y1;
bian[ji].y2=bian[ou].y2=y2;
} sort(bian+,bian+*N+,cmp);
sort(hash+,hash+*N+); COU=;
for(int i=;i<=*N;++i)
if(hash[i]!=hash[i-])
hash[COU++]=hash[i];
--COU; ans=; for(int i=;i<=*N;++i)
{
ans+=BIT[]*(bian[i].x-bian[i-].x); update(find(bian[i].y1),find(bian[i].y2)-,bian[i].state,,COU,);
} cout<<"Test case #"<<cas++<<endl;
cout<<"Total explored area: "<<ans<<endl<<endl;
} return ;
}
(中等) HDU 1542 Atlantis,扫描线。的更多相关文章
- POJ 1151 HDU 1542 Atlantis(扫描线)
题目大意就是:去一个地方探险,然后给你一些地图描写叙述这个地方,每一个描写叙述是一个矩形的右下角和左上角.地图有些地方是重叠的.所以让你求出被描写叙述的地方的总面积. 扫描线的第一道题,想了又想,啸爷 ...
- (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 - [线段树+扫描线]
题目链接: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 ...
- 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(扫描线)题解
题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加. 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的.我们按照x的大小,从左往右扫,然后用线 ...
随机推荐
- win8.1点击“更改电脑设置”无反应(闪退)
系统:win8.1 专业版 症状:win键+C → 设置 → 更改电脑设置,无反应. 尝试办法: 1.SFC /scannow扫描修复,扫描出错误但无法修复.因为曾经为了节省空间,用DISM++清理了 ...
- elasticsearch 手动控制分片分布
elasticsearch可以通过reroute api来手动进行索引分片的分配. 不过要想完全手动,必须先把cluster.routing.allocation.disable_allocatio ...
- 常见的http状态码
[200]请求已成功,请求所希望的响应头或数据体将随此响应返回. [301]被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有连结编辑功能 ...
- select 通过表单提交获取select中的值
<select class="txt" name="choice"> <option value="name" ...
- 网络层 IP 协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)
目录 IP协议首部格式地址解析协议 ARP逆向地址解析协议 RARP网际控制报文协议 ICMP网际组管理协议IGMP IP 数据报首部 IP数据报首部格式: 最高位在左边,记为0 bit:最低位在右边 ...
- BCDedit 研究
bcdedit的研究 系统引导安装 2009-11-12 22:21:13 阅读13 评论0 字号:大中小 首先说明下引导: 微软在Vista之前的系统,采用的是Ntldr来进行引导系统,使用的是bo ...
- android4.0蓝牙使能的详细解析(转)
源:http://www.cnblogs.com/xiaochao1234/p/3818193.html 本文详细分析了android4.0 中蓝牙使能的过程,相比较android2.3,4.0中的蓝 ...
- zf-关于差旅报销的excel表单填写
日期一定要填,还有二级科目事由跟申请金额,如果申请金额为0的话,那么久直接删除哪一行,因为如果不删除的话,Excel表单将提交出错.
- IE6里面display:inlineblock使得块元素成行排列,没用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 总结NAND FLASH控制器的操作
初始化 NAND FLASH: 1)寄存器 NFCONT,用于开启 NAND FLASH控制器: 2)向寄存器NFCMD写入命令: 3)向寄存器NFADDR写入地址: 4)使用寄存器NFDATA进行数 ...