首页 > 代码库 > Hdu 1542
Hdu 1542
题目链接
Atlantis
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6645 Accepted Submission(s): 2923Problem DescriptionThere 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.
InputThe 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.
OutputFor 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 Input210 10 20 2015 15 25 25.50
Sample OutputTest case #1Total explored area: 180.00
Accepted Code:
1 /************************************************************************* 2 > File Name: G.cpp 3 > Author: Stomach_ache 4 > Mail: sudaweitong@gmail.com 5 > Created Time: 2014年07月26日 星期六 19时05分05秒 6 > Propose: hdu 1542 7 ************************************************************************/ 8 #include <cmath> 9 #include <string> 10 #include <cstdio> 11 #include <fstream> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 using namespace std; 16 17 const int maxn = 110; 18 // 保存每条线的信息 19 struct Line { 20 // 线段的横坐标和上下的纵坐标 21 double x, y1, y2; 22 // 线段被覆盖的次数 23 int cover; 24 friend bool operator < (Line a, Line b) { 25 return a.x < b.x; 26 } 27 }line[maxn*2 + 5]; 28 29 //线段树的结点信息, 按y轴建树 30 struct node { 31 double x, y1, y2; 32 // flag表示该线段是否为元线段,元线段即离散化之后相邻的两个y轴之间的线段 33 // cover = 1表示线段是矩形的左边, cover = -1表示矩形的右边 34 int cover, flag; 35 }Tree[maxn*1000]; 36 int n; 37 //保存y轴坐标 38 double y[maxn*2]; 39 40 void build(int root, int L, int R) { 41 Tree[root].x = -1; 42 Tree[root].cover = 0; 43 Tree[root].y1 = y[L]; 44 Tree[root].y2 = y[R]; 45 Tree[root].flag = 0; 46 if (R - L == 1) { 47 Tree[root].flag = 1; 48 return ; 49 } 50 int M = (L + R) / 2; 51 build(root * 2, L, M); 52 build(root * 2 + 1, M, R); 53 } 54 55 double insert(int root, Line &ll) { 56 if (Tree[root].y1 >= ll.y2 || Tree[root].y2 <= ll.y1) { 57 return 0.0; 58 } 59 //走到叶子结点 60 if (Tree[root].flag) { 61 //叶子结点已经被覆盖 62 if (Tree[root].cover > 0) { 63 // 返回面积 64 double ans = (ll.x - Tree[root].x) * (Tree[root].y2 - Tree[root].y1); 65 Tree[root].x = ll.x; 66 Tree[root].cover += ll.cover; 67 return ans; 68 } else { 69 // 更新叶子结点信息 70 Tree[rot].cover += ll.cover; 71 Tree[root].x = ll.x; 72 return 0.0; 73 } 74 } 75 double ans1 = insert(root * 2, ll); 76 double ans2 = insert(root * 2 + 1, ll); 77 return ans1 + ans2; 78 } 79 80 int main(void) { 81 #ifndef ONLINE_JUDGE 82 freopen("in.txt", "r", stdin); 83 #endif 84 int cas = 1; 85 while (~scanf("%d", &n) && n) { 86 int cnt = 0; 87 for (int i = 0; i < n; i++) { 88 double xx, yy, xxx, yyy; 89 scanf("%lf %lf %lf %lf", &xx, &yy, &xxx, &yyy); 90 y[++cnt] = yy; 91 line[cnt].x = xx; line[cnt].y1 = yy; line[cnt].y2 = yyy; 92 line[cnt].cover = 1; 93 y[++cnt] = yyy; 94 line[cnt].x = xxx; line[cnt].y1 = yy; line[cnt].y2 = yyy; 95 line[cnt].cover = -1; 96 } 97 sort(y + 1, y + cnt + 1); 98 sort(line + 1, line + cnt + 1); 99 build(1, 1, cnt);100 double ans = 0.0;101 for (int i = 1; i <= cnt; i++) {102 ans += insert(1, line[i]);103 }104 printf("Test case #%d\nTotal explored area: %.2f\n\n", cas++, ans);105 }106 107 return 0;108 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。