hdu 1542 Atlantis 段树区,并寻求,,,尼玛真坑人数据,不要打开一小阵!
2015-12-06 10:06
387 查看
Atlantis
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7815 Accepted Submission(s): 3420
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
2 10 10 20 20 15 15 25 25.5 0
[align=left]Sample Output[/align]
Test case #1 Total explored area: 180.00
求面积并:
推荐博客:http://www.cnblogs.com/ka200812/archive/2011/11/13/2247064.html
我的代码:
#include <cstdio> #include <algorithm> using namespace std ; double y[300] ; struct Line{ double x , y_up , y_down ; int mark ; }line[300] ; //開始开到110,WA另外三次。! 后来看discuss改后就A了! struct Node{ double x ,y_up,y_down ; int cover ; bool isLeaf ; }st[400100]; bool cmp(const Line &a , const Line &b) { return a.x<b.x ; } void build(int l ,int r , int pos) { st[pos].cover = 0 ; st[pos].y_down = y[l] ; st[pos].y_up = y[r] ; st[pos].x = -1 ; st[pos].isLeaf = false ; if(l+1 == r) { st[pos].isLeaf = true ; return ; } int mid = (l+r)>>1 ; build(l,mid,pos<<1); build(mid,r,pos<<1|1) ; } double insert(double x , double y_up , double y_down , int mark , int pos) { if(st[pos].y_down>=y_up || st[pos].y_up<=y_down) { return 0 ; } if(st[pos].isLeaf) { if(st[pos].cover>0) { double temp = st[pos].x ; double area = (x-temp)*(st[pos].y_up-st[pos].y_down) ; st[pos].x = x ; st[pos].cover += mark ; return area ; } else { st[pos].x = x ; st[pos].cover += mark ; return 0 ; } } return insert(x,y_up,y_down,mark,pos<<1)+insert(x,y_up,y_down,mark,pos<<1|1) ; } int main() { int n , c = 1; while(~scanf("%d",&n) && n) { int index = 0 ; for(int i = 0 ; i < n ; ++i) { double x1,y1,x2,y2 ; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2) ; line[index].x = x1 ; line[index].y_down = y1 ; line[index].y_up = y2 ; y[index] = y1 ; line[index++].mark = 1 ; line[index].x = x2 ; line[index].y_down = y1 ; line[index].y_up = y2 ; y[index] = y2 ; line[index++].mark = -1 ; } sort(y,y+index) ; sort(line,line+index,cmp) ; build(0,index-1,1) ; double area = 0.0 ; for(int i = 0 ; i < index ; ++i) { area += insert(line[i].x,line[i].y_up,line[i].y_down,line[i].mark,1) ; } printf("Test case #%d\n",c++) ; printf("Total explored area: %.2lf\n\n",area) ; } return 0 ; }
而共勉之王
相关文章推荐
- 1010. Radix (25)
- linux下find命令的一个坑
- 20135219洪韶武——信息安全系统设计基础第十三周学习总结
- 再谈2节点VSAN集群的实验环境
- cin.ignore() cin.sync()的区别
- sqlite日期和时间
- LeetCode 237:Delete Node in a Linked List
- DISTINCT的巧妙用法
- iOS关键字含义(基础)
- 1008. Elevator (20)
- Unity3D与MySQL
- Java中的三目运算符 详解
- Visual Studio 2013不能单步调试、不能断点调试的解决方法之一
- 集合的异或运算(对称差)
- 1007. Maximum Subsequence Sum (25)
- 设计模式之装饰者模式(二)---java中的装饰者I/O结构
- linux常用命令解解释
- 【Leetcode】Merge Sorted Array
- Chrome下JQuery的mouseup事件丢失
- Swift在实际项目中的应用