Atlantis

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

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

Mid-Central European Regional Contest 2000

题目的大意就是给定很多矩形地图,求地图能覆盖的亚特兰蒂斯的总面积。

模仿标程写的。和之前不同,这次因为求的是笛卡尔坐标系下的长度,所以要建的是区间树,即build()修改成访问s~m和m~t,update判断标志也要改,改成l<m和m<r,我在这里卡了好久。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,len;
double yy[250];
struct Line{
int f;
double x,y1,y2;
bool operator<(const Line h)const{
return x<h.x;
}
}line[250];
struct tree{
int f;
double len;
}tr[20100];
int bin(double x)
{
int l=0,r=len;
while(l<=r){
int mid=(l+r)>>1;
if(yy[mid]==x)return mid;
if(yy[mid]<x)l=mid+1;
else r=mid-1;
}return l;
}
void pushup(int s,int t,int k)
{
if(tr[k].f)
tr[k].len=yy[t]-yy[s];
else if(s+1==t)tr[k].len=0;
else tr[k].len=tr[k<<1].len+tr[k<<1|1].len;//这里要从下向上推是因为下一次可能要用到,而要不要用考的就是f这个标记了。
}
void build(int s,int t,int k)
{
tr[k].f=tr[k].len=0;//double和int同时等于0似乎也可以,没有类型错误。
if(s+1==t)return;//这里要注意区间树的叶节点的左右边界相差1.
int m=(s+t)>>1;
build(s,m,k<<1);//因为建的是区间树,所以要s~m,m~t。
build(m,t,k<<1|1);
}
void update(int s,int t,int k,int l,int r,int f)
{
if(l<=s&&t<=r){
tr[k].f+=f;//普通的线段树覆盖操作,这里的f不再是一般的lazy标记,而是线段使用标记。
pushup(s,t,k);
return;
}int m=(s+t)>>1;
if(l<m)update(s,m,k<<1,l,r,f);//if语句就很好地表现了其区间树与线段树的不同点。
if(m<r)update(m,t,k<<1|1,l,r,f);
pushup(s,t,k);
}
int main()
{
int cas=0,m;
double x1,y1,x2,y2,ans;
while(scanf("%d",&n)&&n){
m=0;
for(int i=0;i<n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
yy[m]=y1;
line[m].f=1;
line[m].x=x1;
line[m].y1=y1;
line[m++].y2=y2;
yy[m]=y2;
line[m].f=-1;
line[m].x=x2;
line[m].y1=y1;
line[m++].y2=y2;
}sort(yy,yy+m);
sort(line,line+m);
len=1;
for(int i=1;i<m;i++)
if(yy[i-1]!=yy[i])yy[len++]=yy[i];
len--;
build(0,len,1);
ans=0;
for(int i=0;i<m;i++){
update(0,len,1,bin(line[i].y1),bin(line[i].y2),line[i].f);
ans+=tr[1].len*(line[i+1].x-line[i].x);
}printf("Test case #%d\nTotal explored area: %.2f\n\n",++cas,ans);//我看其他大牛的blog上写说.2f不会出错,但.2lf就会,不知道为什么。
}
return 0;
}

hdu 1542 & & poj 1151的更多相关文章

  1. 扫描线三巨头 hdu1928&&hdu 1255 && hdu 1542 [POJ 1151]

    学习链接:http://blog.csdn.net/lwt36/article/details/48908031 学习扫描线主要学习的是一种扫描的思想,后期可以求解很多问题. 扫描线求矩形周长并 hd ...

  2. hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]

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

  3. HDU 1542/POJ 1151 Atlantis (scaning line + segment tree)

    A template of discretization + scaning line + segment tree. It's easy to understand, but a little di ...

  4. ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)

    ●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...

  5. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

  6. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

  7. [POJ 1151] Atlantis

    一样的题:HDU 1542 Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18148   Accepted ...

  8. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)

    Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...

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

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

随机推荐

  1. Http协议与TCP协议简单理解

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...

  2. android Gui系统之WMS(1)----window flags & view flags

    SurfaceFlinger 前面说的,就是一个surface的合成.SurfaceFlinger就是一个默默的记录着,它不会对surface的内容有什么改动. WMS(WindowsManagerS ...

  3. PlantUML的实例参考

    project: blog target: plant-uml-instances.md date: 2015-12-24 status: publish tags: - PlantUML - UML ...

  4. 如何正确并完全安装Visual Studio 2015企业版本?

    http://blog.csdn.net/code_godfather/article/details/47381631  [简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 个人网站: ...

  5. PL/SQL远程备份和恢复Oracle数据库

    (转自:http://blog.csdn.net/huchunfu/article/details/25165901) 在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端.—————— ...

  6. Nginx中文手册

    Nginx 常见应用技术指南[Nginx Tips] 第二版 作者:NetSeek http://www.linuxtone.org (IT运维专家网|集群架构|性能调优) 目 录 一. Nginx ...

  7. 按要求编写Java应用程序。 (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。 创建第

    package com.hanqi.test; public class jidongche { private String chepaihao;//车牌号 private int speed;// ...

  8. python-1 python基础知识

    python第一课代码笔记 hello world [root@heartbeat-data- python]# vim hello1.py #!/usr/bin/env python print ( ...

  9. oracle忘记sys/system/scott用户密码了,如何重置oracle密码?

    今天用到的oracle数据库,但是发现以前设置的密码,忘记了,怎么输入都不对,所以从网上找了一下资料,解决了,然后整理分享给大家. 一.遇到的问题: 1..忘记除SYS.SYSTEM用户之外的用户的登 ...

  10. Java api 入门教程 之 JAVA的IO处理

    IO是输入和输出的简称,在实际的使用时,输入和输出是有方向的.就像现实中两个人之间借钱一样,例如A借钱给B,相对于A来说是借出,而相对于B来说则是借入.所以在程序中提到输入和输出时,也需要区分清楚是相 ...