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

题解:

好像这个是线段树扫描线矩阵合并模板

#include<cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
const int MAXN=300;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
int n;
double all[MAXN];
struct Seg{
double l,r,h;
int d;
Seg(){};//这是一个构造函数,应与结构体或类名相同
Seg(double l,double r,double h,int d):l(l),r(r),h(h),d(d){}
bool operator <(const Seg& rhs )const {
return h<rhs.h;
}
}a[MAXN];
int cnt[MAXN<<2];//懒标记
double sum[MAXN<<2]; void pushup(int l,int r,int rt )
{
if(cnt[rt]) sum[rt]=all[r+1]-all[l];
else if(l==r) sum[rt]=0;
else{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
} void update(int L,int R,int v,int l,int r,int rt)//区间更新
{
if(l>=L&&r<=R)
{
cnt[rt]+=v;
pushup(l,r,rt);
return;
}
int mid=(l+r)>>1;
if(L<=mid)update(L,R,v,l,mid,rt<<1);
if(R>mid) update(L,R,v,mid+1,r,rt<<1|1);
pushup(l,r,rt);
} int main()
{
int Case=0;
while (scanf("%d",&n)!=EOF&&n)
{
double x1,y1,x2,y2;
for (int i = 1; i <=n ; ++i) {
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
a[i]=Seg(x1,x2,y1,1);
a[i+n]=Seg(x1,x2,y2,-1); all[i]=x1;all[i+n]=x2;
}
n<<=1;
sort(a+1,a+1+n);//使线条从下向上排列。 sort(all+1,all+n+1);
int m=unique(all+1,all+1+n)-all-1;//这个函数是"去掉"相邻位置的重复,移到末尾
memset(sum,0,sizeof(sum));
memset(cnt,0, sizeof(cnt));
double ans=0;
for (int i = 1; i <n ; ++i) { int l=lower_bound(all+1,all+1+m,a[i].l)-all;//离散化
int r=lower_bound(all+1,all+1+m,a[i].r)-all; if(l<r) update(l,r-1,a[i].d,1,m,1); ans+=sum[1]*(a[i+1].h-a[i].h);
} printf("Test case #%d\nTotal explored area: %.2lf\n\n",++Case,ans); }
return 0;
}

  

Atlantis HDU - 1542的更多相关文章

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

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

  2. 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))

    扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...

  3. Atlantis HDU - 1542 (线段树扫描线)

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

  4. Atlantis HDU - 1542 (扫描线,线段树)

    扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫.如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把 ...

  5. 线段树->面积并 Atlantis HDU - 1542

    题目链接:https://cn.vjudge.net/problem/HDU-1542 题目大意:求面积并 具体思路:我们首先把矩形分割成一横条一横条的,然后对于每一个我们给定的矩形,我们将储存两个点 ...

  6. Atlantis HDU - 1542 线段树+扫描线 求交叉图形面积

    //永远只考虑根节点的信息,说明在query时不会调用pushdown //所有操作均是成对出现,且先加后减 // #include <cstdio> #include <cstri ...

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

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

  8. (HDU 1542) Atlantis 矩形面积并——扫描线

    n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...

  9. HDU 1542 Atlantis(矩形面积并)

    HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...

随机推荐

  1. ActiveMQ实例2--Spring JMS发送消息

    参考文章:http://my.oschina.net/xiaoxishan/blog/381209#OSC_h3_7 一,步骤参照参考文献 二.新建的项目 三.补充 web.xml <?xml ...

  2. 修改Android系统关机动画

    文件路径:frameworks\base\services\core\java\com\android\server\power\ShutdownThread.java 在beginShutdownS ...

  3. 在 eclipse 中调出其内置的浏览器

    两种方法: 1.点击工具栏中的浏览器图标,就会在主面板中出现浏览器: 跳出一个blank页面,如下: 第二种方法:点击Window——Show view——Other 输入 "browser ...

  4. Linux系统如何设置开机程序自启动

    在Linux系统如何让程序开机时自动启动      核心提示:系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统“开始”--& ...

  5. Do not set "root" as "NOPASSWD" in sudoers file

    cat /etc/sudoers root    ALL=(ALL)ALL: ALL do not change it to root    ALL=(ALL)NOPASSWD: ALL Since ...

  6. helm深入学习

    Helm把Kubernetes资源(比如deployments.services或 ingress等) 打包到一个chart中,而chart被保存到chart仓库.通过chart仓库可用来存储和分享c ...

  7. VirtualBox虚拟机 host/guest 拷贝粘贴,共享剪贴板,安装guest additions

    Oracle VirtualBox 虚拟机,为了在主机.从机间拷贝文件,共享剪贴板,需要进行设置,以及安装guest additions软件 测试环境 host: windows 7 professi ...

  8. bzoj2568 比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

  9. 问题 C: B C++时间类的运算符重载

    题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为表示时间的小时(hour).分(minute),秒(second). 重载运算符“+”,使之能用于时间对象的加法运算:重载运算符 ...

  10. removing vmware debugger from visual studio

    removing vmware debugger from visual studio by Ross on 十月 14, 2010 at 5:30 下午 under Visual Studio |  ...