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. Linux System Programming 学习笔记(五) 进程管理

    1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity in ...

  2. Spring Boot的web开发&静态资源配置方式

    Web开发的自动配置类:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 1.1. 自动配置的ViewResolve ...

  3. Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)

    一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...

  4. 推荐!手把手教你使用Git(转)

    原文出处: 涂根华的博客   欢迎分享原创到伯乐头条 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放 ...

  5. java 8 LocalDateTime 20 例

    http://www.importnew.com/15637.html 伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实 ...

  6. Codeforces Gym 100431A Achromatic Number 欧拉回路

    原题链接:http://codeforces.com/gym/100431/attachments/download/2421/20092010-winter-petrozavodsk-camp-an ...

  7. JD静态网页

    1.制作导航栏 ul>li*n>a 2.制作竖线 a.利用border b.利用  | c.利用矩形,宽度设为1,设置背景色,padding = 0 3.制作下三角 (1)◇ (2)两个盒 ...

  8. SVG动画实践篇-无中生有的线条动画

    git: https://github.com/rainnaZR/svg-animations/tree/master/src/pages/step2/path 说明 这个动画实现的是线条动画,主要用 ...

  9. python获取对象的信息

    Types 判断基本数据类型可以直接写int,str等,但如果要判断一个对象是否是函数怎么办?可以使用types模块中定义的常量. >>> import types >> ...

  10. bubble chat listview

    最近在iOS中用到bubble chat listview,找了个比较有名气的lib(MessagesTableViewController)=>https://github.com/jesse ...