Atlantis

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

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
题目大意:求矩形并的面积.
分析:比较固定的解法:线段树+扫描线.矩形的面积公式是底乘高,每次把相同y坐标的底的长度给加起来,同时向上跳,直到遇到另外一条线位置,那么底的和*高就是扩展得到的面积,这样不断地扩展就能得到答案.具体算法可以参看:传送门
          直接套线段树会有一个问题,[x,x]在这道题中表示的是一个点,是不合法的,而线段树中确是有意义的,如果处理到[x,x+1]继续分治成[x,x],[x+1,x+1]就会出现问题,正确的做法是每次将右端点往左移一位,特判如果此时的l=r,那么就是之前的[x,x+1]这种情况,直接判掉,否则就可以像线段树那样正常地递归下去.
          这道题因为坐标比较大,需要离散化一下,因为高度是需要计算的,所以只需要离散横坐标就可以了.那么线段树记录的就是下标,每次修改一个值都必须要二分查找这个值对应的下标是哪一位.
          比较坑的一个点是数据可能会有0,我在处理的时候没考虑到这种情况,一直爆栈,主要还是离散化的部分鲁棒性不强.
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ; struct node
{
double l, r, h;
int id;
}e[maxn]; double X[maxn], c[maxn << ], XX[maxn], ans;
int cnt, n, tot, tag[maxn << ], cas = ; bool cmp(node a, node b)
{
return a.h < b.h;
} int find(double x)
{ int l = , r = cnt, res = cnt - ;
while (l <= r)
{
int mid = (l + r) >> ;
if (X[mid] >= x)
{
res = mid;
r = mid - ;
}
else
l = mid + ;
}
return res;
} void pushup(int o, int l, int r)
{
if (tag[o])
c[o] = X[r + ] - X[l];
else
if (l == r) //没有被完全覆盖就是两个点
c[o] = ;
else
c[o] = c[o * ] + c[o * + ];
} void update(int o, int l, int r, int x, int y, int v)
{
if (x <= l && r <= y)
{
tag[o] += v;
pushup(o, l, r);
return;
}
int mid = (l + r) >> ;
if (x <= mid)
update(o * , l, mid, x, y, v);
if (y > mid)
update(o * + , mid + , r, x, y, v);
pushup(o, l, r);
} int main()
{
while (~scanf("%d", &n) , n)
{
memset(c, , sizeof(c));
memset(tag, , sizeof(tag));
ans = 0.0;
tot = cnt = ;
for (int i = ; i <= n; i++)
{
double a, b, c, d;
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
e[++tot].l = a;
e[tot].r = c;
e[tot].h = b;
e[tot].id = ;
X[tot] = a;
e[++tot].l = a;
e[tot].r = c;
e[tot].h = d;
e[tot].id = -;
X[tot] = c;
}
sort(X + , X + tot + );
sort(e + , e + + tot, cmp);
XX[] = X[];
cnt = ;
for (int i = ; i <= tot; i++)
if (X[i] != X[i - ])
XX[++cnt] = X[i];
memcpy(X, XX, sizeof(XX));
for (int i = ; i < tot; i++)
{
int l = find(e[i].l), r = find(e[i].r) - ;
update(, , cnt, l, r, e[i].id);
ans += c[] * (e[i + ].h - e[i].h);
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n", cas++, ans);
} return ;
}

Hdu1542 Atlantis的更多相关文章

  1. hdu1542 Atlantis(矩阵面积的并)

    这个题算是我的第一个扫描线的题,扫描线算是一种思想吧,用到线段树+离散化.感觉高大上. 主要参考了这位大神的博客. http://www.cnblogs.com/kuangbin/archive/20 ...

  2. HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...

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

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

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

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

  5. hdu1542 Atlantis (线段树+矩阵面积并+离散化)

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

  6. [HDU1542]Atlantis(扫描线+线段树)

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

  7. hdu-1542 Atlantis(离散化+线段树+扫描线算法)

    题目链接: Atlantis Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/32768 K (Java/Others) ...

  8. HDU-1542 Atlantis(离散化+扫描线)

    题目大意:给n个矩形,可能重叠,求面积. 题目分析:线段树维护扫描线. 代码如下: # include<bits/stdc++.h> using namespace std; # defi ...

  9. HDU1542 Atlantis(矩形面积并)

    #pragma warning (disable:4996) #include<iostream> #include<cstring> #include<string&g ...

随机推荐

  1. Select 、Poll 和 Epoll

    作用 Epoll 和 Select 的作用都是为了多I/O同步复用的问题,利用Epoll.Poll或Select函数指定内核监听多个I/O的读.写.异常事件,避免每一个I/O都指定一个处理线程,导致开 ...

  2. Python基础灬补充(循环、格式化输出)

    for循环&格式化输出 chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪' for year in range(2000, 2013): print("%s年的生肖是:% ...

  3. 在香港网站使用工商银行的MasterCard,工商银行所犯的低级的错误,金融安全何在

  4. VR产业链全景图

  5. Bate版本控制报告

    报告beta阶段2周中,项目的版本控制情况,不包括未在coding.net的部分. 包括不限于:check in (不是push)次数; 总词数为29次 check in log(时间.人员.mess ...

  6. 解决Ubuntu16.04 fatal error: json/json.h: No such file or directory

    参考博客 错误产生 安装json-c库之后,根据GitHub上面的readme文件链接到json-c库时出现以下错误: SDMBNJson.h:9:23: fatal error: json/json ...

  7. mnist测试

    第一步:进入caffe目录 第二步:获取mnist数据集 ./data/mnist/get_mnist.sh 第三步:创建lmdb ./examples/mnist/create_mnist.sh 第 ...

  8. BOM对象属性定时器的调用

    使count中的内容,自动切换 <body> <h1 id="count"></h1> </body> //获取count var ...

  9. WebForm与MVC模式优缺点

    Asp.net Web开发方式,分为两种: 1. WebForm开发 2. Asp.Net MVC开发 MVC是微软对外公布的第一个开源的表示层框架,MVC目的不是取代WebForm开发,只是web开 ...

  10. CodeForces Round #527 (Div3) D2. Great Vova Wall (Version 2)

    http://codeforces.com/contest/1092/problem/D2 Vova's family is building the Great Vova Wall (named b ...