* Atlantis*(矩形面积合并)
Time Limit:1000MS Memory Limit:10000KB
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 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
中文题意:
输入n个矩形,求他们总共占地面积(也就是求一下面积的合并)
输入描述
可能有多组数据,读到n=0为止
每组数据第一行一个数n,表示矩形个数(n<=100)
接下来n行每行4个实数x1,y1,x2,y1(0 <= x1 < x2 <= 100000;0 <= y1 < y2 <= 100000),表示矩形的左下角坐标和右上角坐标
输出描述
每组数据输出一行表示答案
注:不同网站输出格式不同
题解:
用线段树来求解,为线段树中的扫描线
因为所给线为实数,所以应当先离散化,即hash
顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在扫的过程中将矩形分成多个小块,计算出小块矩形的面积,最后进行面积加和。
任意选取一个轴建立线段树,则矩形与选取的轴平行的两条边是没有用的,直接去掉。
假定选则y轴建树:
现想象有一条线从最左边的边开始依次向右扫描。线段树用来维护当前覆盖在y轴上的线段的总长度,初始时总长度为0。用tree.【len】来保存线段长&