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. 我要好offer之 网络大总结

    1. TCP协议的状态机 TCP一共定义了11种状态,这些状态可以使用 netstat 命令查看 @左耳朵耗子 tcp系列教程: 上篇 下篇 2. TCP建立连接3次握手.释放连接4次握手 TCP包头 ...

  2. Redis Cluster 集群的实现和管理

    系统环境 CentOS 7 集群规划 在一台物理机(实际部署应当分散到多个物理机上),创建6个Redis节点,其中3个主节点.3个从节点. 节点表: IP 端口 主从 路径 192.168.1.21 ...

  3. Blog 081018

    对于 linux 系统 api, 尝试理解函数参数和函数之间的内在联系,为什么要用这些参数而不是另一些参数,了解 api 之间的一些共性. 一个扩展性良好的程序,结构都有一些共性,就像是一个国家,有好 ...

  4. XML 增、删、改和查的实例【转】

    原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] 原文地址:http://www.cnblogs.com/skylaugh/archive/2006/12/18/5 ...

  5. anaconda安装及环境变量配置

    最近无聊想的学习一下python. 首先可以在官网上下载与自己电脑兼容的anaconda安装包,网址如下https://www.continuum.io/downloads 下载好后就是一个exe文件 ...

  6. 汇编指令详解--as手册

    https://sourceware.org/binutils/docs/as/ Table of Contents 1 Overview 1.1 Structure of this Manual 1 ...

  7. 33深入理解C指针之---通过字符串传递数据

    一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...

  8. Mac下Android SDK更新不了的解决办法

    在hosts文件中加入: 203.208.46.146   dl.google.com 203.208.46.146 dl-ssl.google.com

  9. AC日记——Dishonest Sellers Codeforces 779c

    C. Dishonest Sellers time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  10. Codeforces 696E ...Wait for it...(树链剖分)

    题目链接  ...Wait for it... 考虑树链剖分. 对于树上的每个点开一个set,记录当前该节点上所有的girls. 每个节点初始的权值为set中的最小值. 询问的时候每次在路径上寻找最小 ...