HDU 1542【线段树--矩形面积的并,扫描线+离散化】
来源:互联网 发布:json 空值 编辑:程序博客网 时间:2024/04/29 09:50
Atlantis
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1663 Accepted Submission(s): 820
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.
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.
Output a blank line after each test case.
Sample Input
210 10 20 2015 15 25 25.50
Sample Output
Test case #1Total explored area: 180.00
Source
Mid-Central European Regional Contest 2000
Recommend
linle
//hdu 1542#include <cstdio>#include <cstring>#include <cctype>#include <algorithm>using namespace std;#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1 const int maxn =200;int cnt[maxn << 2];double sum[maxn << 2];double X[maxn];struct Seg { double h , l , r; int s; Seg(){} Seg(double a,double b,double c,int d) : l(a) , r(b) , h(c) , s(d) {} bool operator < (const Seg &cmp) const { return h < cmp.h; }}ss[maxn];void PushUp(int rt,int l,int r) { if (cnt[rt]) sum[rt] = X[r+1] - X[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 c,int l,int r,int rt) { if (L <= l && r <= R) { cnt[rt] += c; PushUp(rt , l , r); return ; } int m = (l + r) >> 1; if (L <= m) update(L , R , c , lson); if (m < R) update(L , R , c , rson); PushUp(rt , l , r);}int Bin(double key,int n,double X[]) { int l = 0 , r = n - 1; while (l <= r) { int m = (l + r) >> 1; if (X[m] == key) return m; if (X[m] < key) l = m + 1; else r = m - 1; } return -1;}int main() { int n , cas = 1; while (~scanf("%d",&n) && n) { int m = 0; while (n --) { double a , b , c , d; scanf("%lf%lf%lf%lf",&a,&b,&c,&d); X[m] = a; ss[m++] = Seg(a , c , b , 1); X[m] = c; ss[m++] = Seg(a , c , d , -1); } sort(X , X + m); sort(ss , ss + m); int k = 1; for (int i = 1 ; i < m ; i ++) { if (X[i] != X[i-1]) X[k++] = X[i]; } memset(cnt , 0 , sizeof(cnt)); memset(sum , 0 , sizeof(sum)); double ret = 0; for (int i = 0 ; i < m - 1 ; i ++) { int l = Bin(ss[i].l , k , X); int r = Bin(ss[i].r , k , X) - 1; if (l <= r) {update(l , r , ss[i].s , 0 , k - 1, 1); ret += sum[1] * (ss[i+1].h - ss[i].h);} } printf("Test case #%d\nTotal explored area: %.2lf\n\n",cas++ , ret); } return 0;}
- HDU 1542【线段树--矩形面积的并,扫描线+离散化】
- POJ1151 (HDU 1542) Atlantis【矩形面积并,线段树+离散化+扫描线模板】
- HDU 1542 Atlantis(矩形面积并,线段树+离散化+线扫描)
- 线段树求矩形面积并 扫描线+离散化
- 线段树求矩形面积并 扫描线+离散化
- hdu1255 覆盖的面积(线段树+扫描线+离散化,求矩形面积并)
- hdu 1542 Atlantis 线段树矩形面积并+离散化
- poj 1151 poj 1389 线段树+扫描线+离散化 [矩形的面积并]
- UESTC 1600 艾尔大停电 线段树+扫描线、矩形面积并、浮点数的离散化
- http://acm.hdu.edu.cn/showproblem.php?pid=1542 矩形面积的并 线段树 + 扫描线 + 离散化
- hdu 1542 矩形面积并(扫描线+线段树)
- HDU1255 覆盖的面积(线段树,离散化,扫描线,矩形面积交)
- poj 1151 线段树+离散化+扫描线 矩形面积并 (矩阵操作类)
- POJ1151-(线段树扫描线+离散化)求矩形面积并
- 【线段树 + 离散化 + 扫描线】poj 1151 Atlantis 矩形面积并
- Codevs 题目3044 矩形面积求并(线段树+扫描线+离散化)
- HDU1542——Atlantis(扫描线,线段树,矩形面积并,离散化)
- poj 1151 线段树+离散化+扫描线 (矩形面积并
- 【转】现学现用WPS,小技巧大帮助
- 传鲍尔默在微软不受拥护 演讲时员工纷纷离去
- Google+开放后访问量飙升13倍
- unix中的信号处理机制
- 乔布斯妥协的成功:14年前与宿敌微软达成交易
- HDU 1542【线段树--矩形面积的并,扫描线+离散化】
- 个人喜欢的经典名言集
- SCRT连接到虚拟机ubuntu
- XML介绍
- 点击浏览器后退按钮刷新注册码
- 文件操作 Q&A
- 宏Q_OBJECT
- 7继承,覆盖,this super
- 数据结构_图_邻接表做存储结构实现求无向图的连通分量_C++实现