青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 7,comments - 3,trackbacks - 0

 1043: Atlantis


ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE
3s8192K431155Standard

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 containsfour 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 it1.

Output

For each test case, your program should output one section. The first line of each section must be “Testcase #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個矩形的2n個坐標,求矩形的覆蓋面積。如果開一個大的bool數組,將覆蓋過的部分更新為true,再從頭到尾掃描一遍,在坐標范圍比較小的情況下,可以求解。但是如果坐標x,y的取值范圍很大,比如[-10^8,10^8],用上面這個方法就不能求解了;而且坐標還有可能是實數,上面的方法就更加不可行了,需要尋找一種新的解法,就是下面要說到的“離散化”。
    注意到要表示一個矩形,只需要知道其2個頂點的坐標就可以了(最左下,最右上)。可以用2個數組x[0...2n-1],y[0...2n-1]記錄下矩形Ri的2個坐標(x1,y1),(x2,y2),然后將數組x[0...xn-1],y[0...2n-1]排序,為下一步的掃描線作準備,這就是離散化的思想。這題還可以用線段樹做進一步優化,但是這里只介紹離散化的思想。
    看下面這個例子:有2個矩形(1,1),(3,3)和(2,2),(4,4)。如圖:
    圖中虛線表示掃描線,下一步工作只需要將這2個矩形覆蓋過的部分的bool數組的對應位置更新為true,接下去用掃描線從左到右,從上到下掃描一遍,就可以求出矩形覆蓋的總面積。
    這個圖對應的bool數組的值如下:
    1 1 0                       1 2 3
    1 1 1       <---->       4 5 6
    0 1 1                       7 8 9

代碼:

#include<stdio.h>
#include
<iostream>
#include
<algorithm>
#define MAXN 201
using namespace std;

struct Node
{
    
int l, r;//線段樹的左右整點
    int c;//c用來記錄重疊情況
    double cnt, lf, rf;//
    
//cnt用來計算實在的長度,rf,lf分別是對應的左右真實的浮點數端點
} segTree[MAXN * 3];
struct Line
{
    
double x, y1, y2;
    
int f;
} line[MAXN];
//把一段段平行于y軸的線段表示成數組 ,
//x是線段的x坐標,y1,y2線段對應的下端點和上端點的坐標
//一個矩形 ,左邊的那條邊f為1,右邊的為-1,
//用來記錄重疊情況,可以根據這個來計算,nod節點中的c

bool cmp(Line a,Line b)//sort排序的函數
{
    
return a.x < b.x;
}

double y[MAXN];//記錄y坐標的數組
void Build(int t,int l,int r)//構造線段樹
{
    segTree[t].l 
= l;
    segTree[t].r 
= r;
    segTree[t].cnt 
= segTree[t].c = 0;
    segTree[t].lf 
= y[l];
    segTree[t].rf 
= y[r];
    
if (l + 1 == r) return;
    
int mid = (l + r) >> 1;
    Build(t 
<< 1, l, mid);
    Build(t 
<< 1 | 1, mid, r);//遞歸構造
}
void calen(int t)//計算長度
{
    
if (segTree[t].c > 0)
    {
        segTree[t].cnt 
= segTree[t].rf - segTree[t].lf;
        
return;
    }
    
if (segTree[t].l + 1 == segTree[t].r)
        segTree[t].cnt 
= 0;
    
else
        segTree[t].cnt 
= segTree[t << 1].cnt + segTree[t << 1 | 1].cnt;
}
void update(int t, Line e)//加入線段e,后更新線段樹
{
    
if (e.y1 == segTree[t].lf && e.y2 == segTree[t].rf)
    {
        segTree[t].c 
+= e.f;
        calen(t);
        
return;
    }
    
if (e.y2 <= segTree[t << 1].rf)
        update(t 
<< 1, e);
    
else
    
if(e.y1 >= segTree[t << 1 | 1].lf)
        update(t 
<< 1 | 1, e);
    
else
    {
        Line tmp 
= e;
        tmp.y2 
= segTree[t << 1].rf;
        update(t 
<< 1, tmp);
        tmp 
= e;
        tmp.y1 
= segTree[t << 1 | 1].lf;
        update(t 
<< 1 | 1, tmp);
    }
    calen(t);
}
int main()
{
    
int i, n, t, iCase = 0;
    
double x1, y1, x2, y2;
    
while(scanf("%d"&n) && n)
    {
        iCase
++;
        t 
= 1;
        
for(i = 1; i <= n; i++)
        {
            scanf(
"%lf%lf%lf%lf"&x1, &y1, &x2, &y2);
            line[t].x 
= x1;
            line[t].y1 
= y1;
            line[t].y2 
= y2;
            line[t].f 
= 1;
            y[t] 
= y1;
            t
++;
            line[t].x 
= x2;
            line[t].y1 
= y1;
            line[t].y2 
= y2;
            line[t].f 
= -1;
            y[t] 
= y2;
            t
++;
        }
        sort(line 
+ 1, line + t, cmp);
        sort(y 
+ 1, y + t);
        Build(
11, t - 1);
        update(
1, line[1]);
        
double res = 0;
        
for(i = 2; i < t; i++)
        {
            res 
+= segTree[1].cnt * (line[i].x - line[i - 1].x);
            update(
1, line[i]);
        }
        printf(
"Test case #%d\n", iCase);
        printf(
"Total explored area: %.2lf\n\n", res);
    }
    
return 0;
}
posted on 2011-10-25 23:52 LLawliet 閱讀(276) 評論(0)  編輯 收藏 引用 所屬分類: 線段樹

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产在线麻豆精品观看| 国产精品久久久久91| 黄色av一区| 久久久久久一区二区| 亚洲欧美综合v| 国产农村妇女毛片精品久久莱园子 | 亚洲一区二区三区欧美| 欧美视频不卡中文| 亚洲一区二区三区免费视频| 亚洲一区www| 国产色视频一区| 噜噜噜久久亚洲精品国产品小说| 久久国产视频网| 亚洲激情亚洲| 一区电影在线观看| 国产一本一道久久香蕉| 美女精品网站| 欧美日韩日韩| 欧美在线观看一区二区| 久久久久网站| 一本在线高清不卡dvd| 亚洲午夜精品17c| 海角社区69精品视频| 亚洲国产精品va在线看黑人| 欧美日韩国产综合视频在线| 欧美诱惑福利视频| 欧美成人免费网站| 亚洲欧美中文另类| 久久躁日日躁aaaaxxxx| 99这里只有精品| 亚洲欧美在线一区| 亚洲精品一区二区三区樱花| 亚洲一区二区三区四区视频| 亚洲第一精品影视| 亚洲一区二区三区中文字幕在线| 在线免费观看日韩欧美| 99re热这里只有精品免费视频| 国产一区二区三区久久悠悠色av| 亚洲国产美女| 好吊妞这里只有精品| 99亚洲精品| 亚洲第一精品夜夜躁人人躁| 亚洲视频在线观看三级| 亚洲裸体在线观看| 久久久精品免费视频| 午夜精品福利电影| 欧美精品乱码久久久久久按摩| 久久视频免费观看| 国产欧美一区二区三区另类精品| 欧美激情一区二区三区成人| 国内精品久久久久久久果冻传媒| 亚洲视频欧洲视频| 99精品视频一区二区三区| 久久久噜久噜久久综合| 久久精品99无色码中文字幕| 欧美日韩在线不卡一区| 亚洲国产精品久久久久秋霞不卡 | 国内一区二区在线视频观看 | 一本一本久久a久久精品综合麻豆| 亚洲第一精品在线| 免费的成人av| 亚洲无线一线二线三线区别av| 午夜精品影院在线观看| 亚洲精品少妇30p| 午夜精品久久久久久久99热浪潮| 狠狠爱www人成狠狠爱综合网| 一区二区国产在线观看| 亚洲福利国产| 性色av一区二区三区红粉影视| 亚洲国产综合91精品麻豆| 亚洲性感美女99在线| 亚洲第一在线综合网站| 欧美一区二区视频在线| 亚洲欧美一区在线| 欧美日韩成人综合| 欧美福利网址| 亚洲大片一区二区三区| 欧美亚洲日本网站| 欧美亚洲日本国产| 国产精品magnet| 夜夜爽www精品| 国产精品资源在线观看| 香蕉久久久久久久av网站| 亚洲欧美综合精品久久成人| 欧美日韩国产精品专区| 欧美激情在线观看| 亚洲国产日韩综合一区| 老司机成人在线视频| 久久久久久久久蜜桃| 国产欧美日本一区视频| 亚洲免费视频在线观看| 亚洲一区二区3| 欧美日韩国产首页| 亚洲精品在线看| 99re66热这里只有精品3直播| 欧美激情一区二区三区 | 久久久久99| 欧美日韩三级| 欧美亚洲视频在线看网址| 欧美亚洲视频在线观看| 国产欧美激情| 欧美伊人久久大香线蕉综合69| 久久久久国产成人精品亚洲午夜| 国产一区二区日韩精品| 久久久亚洲精品一区二区三区 | 激情综合五月天| 久久久久久婷| 91久久一区二区| 亚洲男人的天堂在线| 国产一区二区三区久久久久久久久 | 国产精品成人v| 亚洲欧美日本精品| 久久久久久久波多野高潮日日| 黄页网站一区| 欧美日韩国产在线| 欧美一级大片在线观看| 欧美激情日韩| 亚洲主播在线观看| 国一区二区在线观看| 牛人盗摄一区二区三区视频| 日韩午夜三级在线| 久久午夜色播影院免费高清| 亚洲欧洲在线播放| 国产精品乱子乱xxxx| 久久久久久91香蕉国产| 91久久精品国产91性色| 性做久久久久久久久| 在线成人性视频| 欧美激情亚洲一区| 噜噜噜噜噜久久久久久91| 99国产精品久久久久久久| 久久久www成人免费精品| 日韩视频二区| 国内精品久久久久影院薰衣草| 欧美黄色aa电影| 新狼窝色av性久久久久久| 亚洲七七久久综合桃花剧情介绍| 欧美一区2区三区4区公司二百| 在线观看国产成人av片| 国内精品视频666| 欧美日韩在线精品| 欧美不卡在线视频| 香蕉久久夜色精品| 一区二区三区国产| 亚洲国产另类久久精品| 久久精品系列| 亚洲男人第一网站| 亚洲在线观看视频| 日韩视频一区二区| 在线免费高清一区二区三区| 国产女主播一区二区| 欧美日韩在线观看视频| 欧美暴力喷水在线| 久久久久免费观看| 亚洲午夜电影网| 午夜精品一区二区三区在线| 一片黄亚洲嫩模| 亚洲精品欧美日韩| 亚洲区一区二区三区| 亚洲国产精品传媒在线观看| 欧美成黄导航| 欧美成人午夜激情视频| 久久久91精品国产| 欧美国产日本高清在线| 玖玖国产精品视频| 免费观看不卡av| 美女国产一区| 欧美sm极限捆绑bd| 欧美成人精品激情在线观看| 欧美成人午夜77777| 美女国内精品自产拍在线播放| 另类亚洲自拍| 欧美激情第二页| 亚洲黄色免费| 亚洲美女在线国产| 日韩一区二区久久| 亚洲一区二区av电影| 久久精品国产亚洲高清剧情介绍| 香蕉尹人综合在线观看| 香蕉免费一区二区三区在线观看 | 日韩一级网站| 亚洲无人区一区| 欧美一区午夜精品| 欧美中文字幕在线观看| 亚洲第一精品在线| 一区二区三区国产精品| 亚洲欧美怡红院| 久久精品夜夜夜夜久久| 欧美成黄导航| 国产精品v日韩精品| 国产视频精品xxxx| 日韩午夜激情av| 亚洲免费影视| 久久亚洲欧洲| 99re热这里只有精品视频| 午夜伦欧美伦电影理论片| 久久蜜臀精品av| 欧美三级视频在线观看| 欧美极品在线观看| 极品少妇一区二区三区精品视频|