Atlantis
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 23181   Accepted: 8644

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 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

 
题目大意:给出一些矩形,算他们的面积并
试题分析:乍一看并不是用线段树,知道扫描线后就很好做了。
     扫描线是什么呢?
    扫描线可以从左到右或者从上到下(方向无所谓),就是从上开始扫,扫到一个矩形的开头那么这个矩形就可以进入我们的面积计算,扫到末尾就退出。
    这一过程我们就可以用线段树来维护,由于坐标可能有浮点数,所以就需要操作时离散化一下。
    这次没有写差分+离散化+线段树,差分要标记下传,直接储存也挺好做的

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std; inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int MAXN=100001;
const int INF=999999;
int N,M;
double a[100001],b[100001];
int A[100001];
struct data2{
double sum,len;
int ct;
}tr[1000001];
int tmp,tmp2;
struct data{
double x,y1,y2;
bool end;
}poi[1000001];
int T; bool cmp(data a,data b){
return a.x<b.x;
}
void build(int l,int r,int rt){
tr[rt].ct=0;tr[rt].sum=0;
tr[rt].len=a[r]-a[l];
if(l+1>=r) return ;
int mid=(l+r)>>1;
build(l,mid,rt*2);
build(mid,r,rt*2+1);
return ;
}
void Update(int rt,int l,int r){
if(tr[rt].ct) tr[rt].sum=tr[rt].len;
else if(r-l>1) tr[rt].sum=tr[rt*2].sum+tr[rt*2+1].sum;
else tr[rt].sum=0;
return ;
}
void add(int l,int r,int rt,int L,int R){
if(L==l&&R==r){
tr[rt].ct++;
Update(rt,l,r);
return ;
}
int mid=(l+r)>>1;
if(L>=mid) add(mid,r,rt*2+1,L,R);
else if(R<=mid) add(l,mid,rt*2,L,R);
else{
add(mid,r,rt*2+1,mid,R);
add(l,mid,rt*2,L,mid);
}
Update(rt,l,r);
return;
}
void del(int l,int r,int rt,int L,int R){
if(L==l&&R==r){
tr[rt].ct--;
Update(rt,l,r);
return ;
}
int mid=(l+r)>>1;
if(L>=mid) del(mid,r,rt*2+1,L,R);
else if(R<=mid) del(l,mid,rt*2,L,R);
else{
del(mid,r,rt*2+1,mid,R);
del(l,mid,rt*2,L,mid);
}
Update(rt,l,r);
return;
} double ans;
int main(){
while(1){
N=read();
if(!N) break;
tmp2=tmp=0;double x1,x2,y1,y2;
for(int i=1;i<=N;i++){
cin>>x1>>y1>>x2>>y2;
poi[++tmp].x=x1;
poi[tmp].y1=y1;
poi[tmp].y2=y2;
poi[tmp].end=false;
poi[++tmp].x=x2;
poi[tmp].y1=y1;
poi[tmp].y2=y2;
poi[tmp].end=true;
}
for(int i=1;i<=tmp;i+=2){
a[tmp2]=b[tmp2]=poi[i].y1;tmp2++;
a[tmp2]=b[tmp2]=poi[i].y2;tmp2++;
}
sort(poi+1,poi+tmp+1,cmp);
sort(a,a+tmp2);
int tmp3=0,tmp4=0;
tmp3=unique(a,a+tmp2)-a;
ans=0;
build(0,tmp3-1,1);
double lasth;
for(int i=1;i<tmp;i++){
if(!poi[i].end) add(0,tmp3-1,1,lower_bound(a,a+tmp3,poi[i].y1)-a,lower_bound(a,a+tmp3,poi[i].y2)-a);
else del(0,tmp3-1,1,lower_bound(a,a+tmp3,poi[i].y1)-a,lower_bound(a,a+tmp3,poi[i].y2)-a);
ans+=(double)((poi[i+1].x-poi[i].x)*tr[1].sum);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",++T,ans);
}
}

  

【线段树】Atlantis的更多相关文章

  1. 线段树---Atlantis

    题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110064#problem/A Description There are se ...

  2. hdu 1542 Atlantis(线段树,扫描线)

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

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

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

  4. POJ 1542 Atlantis(线段树 面积 并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 参考网址:http://blog.csdn.net/sunmenggmail/article/d ...

  5. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

    [题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...

  6. 【POJ1151】Atlantis(线段树,扫描线)

    [POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...

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

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

  8. HDU 1542 Atlantis(线段树面积并)

     描述 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...

  9. hdu1542 Atlantis (线段树+扫描线+离散化)

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

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

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

随机推荐

  1. bzoj 1034 贪心

    首先如果我们想取得分最高的话,肯定尽量赢,实在赢不了的话就耗掉对方最高的,那么就有了贪心策略,先排序,我方最弱的马和敌方最弱的相比,高的话赢掉,否则耗掉敌方最高的马. 对于一场比赛,总分是一定的,所以 ...

  2. LINUX内核面试题摘选

    转载:http://blog.csdn.net/zm1_1zm/article/details/77231197 1) Linux中主要有哪几种内核锁? 答:Linux的同步机制从2.0到2.6以来不 ...

  3. centos7系统安装配置

    下载centos7 iso镜像 电脑里面本来有ubuntu系统,直接在u盘做好启动盘安装即可,选择手动分区(忘了),将原本ubuntu系统分区压缩200G.系统不要选择最小化,选择gnome的图形界面 ...

  4. python基础===isinstance() 函数,判断一个对象是否是一个已知的类型

    isinstance(object, classinfo) object -- 实例对象. classinfo -- 可以是直接或间接类名.基本类型或者有它们组成的元组. >>>a ...

  5. rtems-os-source

    http://blog.csdn.net/xpx3216/article/details/5776941 http://tech.hqew.com/fangan_421204 https://gith ...

  6. 2017多校第9场 HDU 6162 Ch’s gift 树剖加主席树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6162 题意:给出一棵树的链接方法,每个点都有一个数字,询问U->V节点经过所有路径中l < ...

  7. php 读写 csv文件

    读取csv function input_csv($handle) { $out = array (); $n = 0; while ($data = fgetcsv($handle, 10000)) ...

  8. 关于那些Android中不常用的设置属性

    很多在manifest中的属性我们经常遗忘了它们,或者经常看到但又不是很明白它的作用.那么在这里我就拿了一些属性简单的解释一下,防止以后碰到却不知道其中的意思.不是很全,以后会断断续续的补充吧 一.a ...

  9. python 基础 习题

    1.执行 Python 脚本的两种方式2.简述位.字节的关系 1Byte = 8bits 3.简述 ascii.unicode.utf-8.gbk 的关系 都是字符集,unicode兼容其他3种字符集 ...

  10. 【python】if __name__ == '__main__'

    转载自:http://www.cnblogs.com/xuxm2007/archive/2010/08/04/1792463.html 当你打开一个.py文件时,经常会在代码的最下面看到if __na ...