(中等) 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的大小,从左往右扫,然后用线 ...
随机推荐
- CodeForces 510B DFS水题
题目大意:在图中找到一个字符可以围成一个环(至少有环四个相同元素) 题目思路:对当前点进行搜索,如果发现可以达到某个已经被查找过的点,且当前点不是由这个点而来,则查找成功. #include<c ...
- 【转】关于C execlp函数的理解
转自:http://bachue.is-programmer.com/posts/21611.html execlp(从PATH 环境变量中查找文件并执行) 相关函数 fork,execl,execl ...
- 初识Ubuntu
刚刚装好bantu 16.10就遇到了好多问题,记录一下 一.卸载一些用不到的软件. 1.su认证失败 sudo passwd //输入命令,然后修改密码即可 2.卸载libreoffice sudo ...
- liunx 定时执行 php文件
which php 寻找php路径
- oracle10g遇到ORA-16038日志无法归档问题
SQL> shutdown immediate ORA-01109: 数据库未打开 已经卸载数据库. ORACLE 例程已经关闭. SQL> startup ORACLE 例程已经启动. ...
- PullToRefreshGridView上拉加载、下拉刷新
eclipse中的项目: //注意:此刷新功能是使用的第三方的PullToRefreshScrollView,因此需要导入第三方library作为依赖 步骤:导入第三方library,依赖:点击你的应 ...
- [转]解决LinearLayout中控件不能居右对齐
在LinearLayout布局时使用右对齐(android:layout_gravity="right")控件对齐方式不生效,需要设置 android:layout_weight= ...
- GameUnity 2.0 文档(三) 纸片人八方向
DirectSprite类 有别于 上篇文档出现的 AnimationSprite类 (从头播放到尾) 这个类根据 path的图,如果是 8*8 64个图 八方向,可以设置长宽和 角度 角度 代表 8 ...
- Class.forName() 初始化、Thread.currentThread().getContextClassLoader().getResourceAsStream
Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? Cl ...
- HDU 1043 八数码(八境界)
看了这篇博客的讲解,挺不错的.http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 判断无解的情况(写完七种境界才发现有直接判 ...