Problem Description

  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,扫描线。的更多相关文章

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

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

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

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

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

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

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

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

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

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

  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(段树&amp;扫描线&amp;面积和)

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

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

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

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

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

随机推荐

  1. POJ - 3666 Making the Grade(dp+离散化)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  2. oracle 管理

    1.管理数据的用户主要是:sys和system. 区别:(1)sys所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle是至关重要的,由数据库自己维护,任何用户都 ...

  3. Windows API 之 OpenProcessToken、GetTokenInformation

    The following example uses the OpenProcessToken and GetTokenInformation functions to get the group m ...

  4. update set from where

    原文链接:http://blog.csdn.net/xcbsdu/article/details/6736503 关于update set from where 下面是这样一个例子: 两个表a.b,想 ...

  5. HDU 5889 (最短路+网络流)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  6. 【项目笔记】拿宽高前measure(widthMeasureSpec, heightMeasureSpec)的使用技巧

    我们知道获取宽高一般写法是: view.measure(0, 0); view.getMeasuredHeight(); 拿宽高前什么时候可以直接用measure(0, 0);而什么时候不能用meas ...

  7. CF 313 DIV2 B 树状数组

    http://codeforces.com/contest/313/problem/B 题目大意 给一个区间,问你这个区间里面有几个连续相同的字符. 思路: 表示个人用树状数组来写的...了解了树状数 ...

  8. Android ART运行时无缝替换Dalvik虚拟机的过程分析

    Android ART运行时无缝替换Dalvik虚拟机的过程分析 分类: Android2014-01-13 00:59 42722人阅读 评论(66) 收藏 举报 AndroidARTDalvikV ...

  9. Use View.isInEditMode() in your custom views to skip code when shown in Eclipse

    今天在做自定义ViewGroup中,出现了一下错误提示Use View.isInEditMode() in your custom views to skip code when shown in E ...

  10. 个人学习FPGA的初步过程

    对于FPGA,完全是从零开始学习,简单讲述一下我个人学习FPGA的经历吧: 没有开发板的日子.说真的要我掏腰包买开发板觉得是一件非常奢侈的事情.理由1:现成的东西,背后影藏诸多诡异的事情我们是无法体会 ...