Atlantis

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11777    Accepted Submission(s): 4983

 

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.
 
 

 

Input
The input file consists of several test cases. Each test case starts with a
line containing a single integer n (1<=n<=100) of available maps. The n
following lines describe one map each. Each of these lines contains four
numbers x1;y1;x2;y2 (0<=x1<x2<=100000;0<=y1<y2<=100000), not necessarily
integers. The values (x1; y1) and (x2;y2) are the coordinates of the
top-left resp. bottom-right corner of the mapped area.

The input file is terminated by a line containing a single 0. Don’t process
it.

 

 

Output
For each test case, your program should output one section. The first line
of each section must be “Test case #k”, where k is the number of the test
case (starting with 1). The second one must be “Total explored area: a”,
where a is the total explored area (i.e. the area of the union of all
rectangles in this test case), printed exact to two digits to the right of
the decimal point.

Output a blank line after each test case.
 

 

 

Sample Input
 
2 10 10 20 20 15 15 25 25.5 0
 
 

 

Sample Output
 
Test case #1 Total explored area: 180.00
 
 

 

Source
 

 

Recommend
linle   |   We have carefully selected several similar problems for you:  1828 1255 1698 1540 1754 

【题意】:

给你n个矩形的左下角(x1,y1),右上角(x2,y2),让你求n个矩形面积的并

【分析】:见这里

【代码】:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define m(s) memset(s,0,sizeof s)
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int N=1e5+;
struct node{
double xl,xr,h;
int id;
bool operator < (const node &a)const{
return h<a.h;
}
}b[N];
int n,kase,tag[N<<];
double sum[N<<],c[N];
void updata(int k,int l,int r){
if(tag[k]) sum[k]=c[r+]-c[l];//当前区间被线段覆盖
else if(l==r) sum[k]=;//已经到了叶子结点且没有被覆盖
else sum[k]=sum[lc]+sum[rc];// 没有完全被覆盖,但是还没到叶子结点,从其子区间中获得信息
}
void change(int k,int l,int r,int x,int y,int val){
if(x<=l&&r<=y){
tag[k]+=val;updata(k,l,r);
return ;
}
int mid=l+r>>;
if(x<=mid) change(lc,l,mid,x,y,val);
if(y>mid) change(rc,mid+,r,x,y,val);
updata(k,l,r);
}
int main(){
while(~scanf("%d",&n)&&n){
int cnt=;double ans=;
double x1,x2,y1,y2;
m(sum);m(tag);
for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
b[++cnt]=(node){x1,x2,y1,};c[cnt]=x1;
b[++cnt]=(node){x1,x2,y2,-};c[cnt]=x2;
}
sort(b+,b+cnt+);
sort(c+,c+cnt+);
int t=unique(c+,c+cnt+)-(c+);
for(int i=;i<cnt;i++){
x1=lower_bound(c+,c+t+,b[i].xl)-c;
x2=lower_bound(c+,c+t+,b[i].xr)-c-;
change(,,t,x1,x2,b[i].id);
ans+=(b[i+].h-b[i].h)*sum[];
}
printf("Test case #%d\n",++kase);
printf("Total explored area: %.2f\n\n",ans);
}
return ;
}
/*
奉送一组数据
输入:
3
10 10 20 20
15 15 25 30
22 8 28 17 输出:
Test case #1
Total explored area: 273.00

再送大家一道题:poj 1389
整体思路一模一样,只是一个为整数,一个为实数,输入输出格式不一样。。
*/

-------------------------------------

-------------------------------------

poj 1389

#include<cstdio>
#include<cstring>
#include<algorithm>
#define m(s) memset(s,0,sizeof s)
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int N=1e5+;
struct node{
int xl,xr,h;
int id;
bool operator < (const node &a)const{
return h<a.h;
}
}b[N];
int n,kase,tag[N<<];
int sum[N<<],c[N];
void updata(int k,int l,int r){
if(tag[k]) sum[k]=c[r+]-c[l];
else if(l==r) sum[k]=;
else sum[k]=sum[lc]+sum[rc];
}
void change(int k,int l,int r,int x,int y,int val){
if(x<=l&&r<=y){
tag[k]+=val;updata(k,l,r);
return ;
}
int mid=l+r>>;
if(x<=mid) change(lc,l,mid,x,y,val);
if(y>mid) change(rc,mid+,r,x,y,val);
updata(k,l,r);
}
int main(){
int x1,x2,y1,y2;
while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2),~x1){
int cnt=,ans=;m(sum);m(tag);
b[++cnt]=(node){x1,x2,y1,};c[cnt]=x1;
b[++cnt]=(node){x1,x2,y2,-};c[cnt]=x2;
while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2),~x1){
b[++cnt]=(node){x1,x2,y1,};c[cnt]=x1;
b[++cnt]=(node){x1,x2,y2,-};c[cnt]=x2;
}
sort(b+,b+cnt+);
sort(c+,c+cnt+);
int t=unique(c+,c+cnt+)-(c+);
for(int i=;i<cnt;i++){
x1=lower_bound(c+,c+t+,b[i].xl)-c;
x2=lower_bound(c+,c+t+,b[i].xr)-c-;
change(,,t,x1,x2,b[i].id);
ans+=(b[i+].h-b[i].h)*sum[];
}
printf("%d\n",ans);
}
return ;
}

hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]的更多相关文章

  1. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  2. POJ 1151 - Atlantis 线段树+扫描线..

    离散化: 将所有的x轴坐标存在一个数组里..排序.当进入一条线段时..通过二分的方式确定其左右点对应的离散值... 扫描线..可以看成一根平行于x轴的直线..至y=0开始往上扫..直到扫出最后一条平行 ...

  3. HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)

    传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...

  4. hdu1828 线段树扫描线求矩形面积的周长

    题意:       给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路:       线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...

  5. 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交

    E - 秋实大哥与家 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...

  6. poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)

    题目链接 Description A number of rectangular posters, photographs and other pictures of the same shape a ...

  7. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

  8. POJ 1151 Atlantis 线段树+离散化+扫描线

    这次是求矩形面积并 /* Problem: 1151 User: 96655 Memory: 716K Time: 0MS Language: G++ Result: Accepted */ #inc ...

  9. hdu1542 Atlantis 线段树--扫描线求面积并

    There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...

随机推荐

  1. LOOPS(hdu 3853)

    题意:迷宫是一个R*C的布局,每个格子中给出停留在原地,往右走一个,往下走一格的概率,起点在(1,1),终点在(R,C),每走一格消耗两点能量,求出最后所需要的能量期望 /* 刚开始以为这就是个**题 ...

  2. poj 4001 To Miss Our Children Time

    To Miss Our Children Time Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Jav ...

  3. GSMArena battery life test

    GSMArena battery life test Battery Endurance Score = [ Battery Capacity / ( call hrs * a + Browsing ...

  4. 拖拽排序插件 ---- Dragula

    相关链接:  https://github.com/bevacqua/react-dragula https://github.com/bevacqua/react-dragula demo:  ht ...

  5. Manajro17配置

    :Manjaro近来点击率一直排行第一,比较适合笔记本使用,这次从下载刻录开始讲述: 1: 下载刻录 因为一些环境特殊原因,官网下载还是比较慢的,普通用户还是从清华镜像源下载比较快,当然你也可以选择官 ...

  6. [开源] FreeSql.Tools Razor 生成器

    FreeSql 经过半年的开发和坚持维护,在 0.6.x 版本中完成了几大重要事件: 1.按小包拆分,每个数据库实现为单独 dll: 2.实现 .net framework 4.5 支持: 3.同时支 ...

  7. 2017-10-29-afternoon-清北模拟赛

    T1 洗澡 贪心:将未匹配的右括号花费1变为左括号,最有多余的左括号有一半变成右括号 #include <cstring> #include <cstdio> ); int n ...

  8. Java多线程中Lock的使用

    Jdk1.5以后,在java.util.concurrent.locks包下,有一组实现线程同步的接口和类,说到线程的同步,可能大家都会想到synchronized关键字, 这是java内置的关键字, ...

  9. golang实现dns域名解析(一)

    本文将详细讲解如何用go语言一步一步实现dns域名解析的过程,并简单介绍点dns有关的知识,直接开始正题吧. 首先我们要了解dns解析的过程,没有了解的请看这里DNS入门(转)很详细.扫盲结束后,我们 ...

  10. 邁向IT專家成功之路的三十則鐵律 鐵律二十八 IT人教學之道-速戰

    所謂IT人教學之道是指可善用在工作之中帶領新人快速上手,或是使用在生活中指導他人迅速學會某項技能的重要經驗.相信大家都有當過新手被指導的體驗,也有擔任過資深的老手帶領新人的經驗.然而您可能不知道,即便 ...