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

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 閱讀(273) 評論(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>
            欧美韩日一区二区三区| 欧美成人中文| 欧美chengren| 免费日韩av片| 亚洲精品一区二区三| 99riav国产精品| 亚洲午夜羞羞片| 久久国产精品一区二区三区四区 | 欧美一区二区三区婷婷月色| 欧美日韩在线精品一区二区三区| 亚洲一区二区三区中文字幕在线| 欧美高潮视频| 久久久久国产精品午夜一区| 欧美亚洲在线| 亚洲免费在线视频| 国产精品99久久久久久久久久久久| 精品999网站| 在线观看日韩av| 国产主播喷水一区二区| 欧美男人的天堂| 亚洲无线视频| 欧美综合国产| 久久婷婷激情| 久久免费观看视频| 欧美国产在线观看| 欧美精品免费播放| 在线一区日本视频| 国产日韩专区| 欧美11—12娇小xxxx| 欧美三级特黄| 国产专区欧美精品| 亚洲视频欧美视频| 欧美www在线| 一本色道久久综合亚洲精品高清 | 国产精品永久| 在线一区亚洲| 亚洲电影免费| 欧美亚洲一区在线| 国产精品久久毛片a| 99精品国产一区二区青青牛奶| 久久亚洲色图| 亚洲嫩草精品久久| 国产精品高潮呻吟| 亚洲午夜视频在线| 91久久一区二区| 欧美插天视频在线播放| 国内精品写真在线观看| 久久精品成人欧美大片古装| 99国产精品视频免费观看一公开 | 久久精品日产第一区二区| 99国内精品久久| 欧美经典一区二区三区| 亚洲人成绝费网站色www| 另类人畜视频在线| 欧美一区成人| 国产亚洲精品久久久久动| 欧美一区二区在线免费观看 | 最新国产成人在线观看| 久久天天躁狠狠躁夜夜av| 国产字幕视频一区二区| 久久国产精品99精品国产| 亚洲一区二区精品在线| 国产精品久久久久一区二区| 亚洲女同在线| 亚洲综合国产| 国产一区二区三区免费观看| 麻豆精品在线视频| 久久综合五月| 一本色道久久综合一区| 亚洲深夜激情| 一本一本大道香蕉久在线精品| 亚洲大片免费看| 欧美日韩成人一区| 亚洲欧美国产三级| 午夜视频一区在线观看| 国产视频自拍一区| 麻豆免费精品视频| 欧美 日韩 国产一区二区在线视频 | 亚洲电影第1页| 欧美激情综合五月色丁香| 亚洲视频一起| 欧美在线视频a| 亚洲日本成人| 亚洲视频香蕉人妖| 国外成人在线| 亚洲日本一区二区三区| 国产日韩欧美黄色| 欧美黑人在线播放| 国产精品chinese| 美国十次了思思久久精品导航| 欧美成人激情视频| 欧美一激情一区二区三区| 久久人人97超碰人人澡爱香蕉 | 亚洲综合成人婷婷小说| 性8sex亚洲区入口| 99在线观看免费视频精品观看| 亚洲中字黄色| 亚洲精品视频免费观看| 欧美一二三视频| 艳女tv在线观看国产一区| 欧美在线免费观看| 亚洲性视频网站| 免费亚洲电影| 久久久水蜜桃| 国产精品视频导航| 亚洲经典在线| 在线电影一区| 久久99在线观看| 亚洲欧美日韩国产成人| 免费亚洲电影| 免费视频最近日韩| 国产三级欧美三级| 夜夜爽99久久国产综合精品女不卡| 伊人久久婷婷色综合98网| 亚洲一区视频在线| 亚洲一区二区三区激情| 欧美成人免费网站| 久热精品视频在线| 国产一区久久久| 香蕉亚洲视频| 欧美一区二区三区精品电影| 欧美日产国产成人免费图片| 欧美成熟视频| 亚洲国产成人av| 久久九九免费| 狂野欧美一区| 精品va天堂亚洲国产| 欧美专区第一页| 在线日韩中文字幕| 久久久久久999| 国产美女一区二区| 一区二区三区四区五区精品视频| 日韩视频一区二区三区在线播放 | 国产精品你懂的| 亚洲图片欧洲图片av| 亚洲视频免费在线观看| 欧美日韩国产在线看| 亚洲激情在线播放| 一本久久a久久免费精品不卡| 欧美激情在线| 亚洲精品久久久久中文字幕欢迎你| 亚洲国产一区二区三区在线播 | 国产午夜精品在线| 欧美综合国产精品久久丁香| 久久中文字幕一区| 亚洲国产精品va在线看黑人| 久久久久综合| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美大尺度在线观看| 亚洲国产精品一区二区第四页av| 亚洲电影观看| 麻豆91精品91久久久的内涵| 免费视频一区| 99热在这里有精品免费| 国产精品草莓在线免费观看| 亚洲一区制服诱惑| 久久亚洲一区二区| 日韩视频中文字幕| 国产精品日韩一区二区三区| 欧美在线视频观看免费网站| 欧美成人三级在线| 亚洲一卡二卡三卡四卡五卡| 国产深夜精品| 欧美xx69| 亚洲欧美久久久久一区二区三区| 美女精品自拍一二三四| 99这里只有久久精品视频| 国产精品日本| 欧美高清视频一区| 欧美一区激情| 亚洲精品日韩精品| 久久久精品欧美丰满| 一本久道久久综合婷婷鲸鱼| 国产亚洲精品久久久久久| 欧美福利一区二区三区| 午夜精品久久久久久久久| 欧美国产综合视频| 午夜精品久久久久久久99水蜜桃 | 欧美在线精品免播放器视频| 亚洲国产精品一区二区www在线| 欧美国产欧美综合 | 亚洲欧美中文日韩在线| 亚洲欧洲精品一区二区三区不卡 | 夜夜嗨一区二区| 中国成人亚色综合网站| 尤物yw午夜国产精品视频明星| 欧美激情综合色| 性做久久久久久| 在线视频中文亚洲| 亚洲国产成人91精品| 欧美在线亚洲一区| 欧美美女福利视频| 久久久久久久久岛国免费| 亚洲永久免费av| 亚洲三级色网| 欧美xxx在线观看| 久久综合九色99| 欧美一区永久视频免费观看| 99re6这里只有精品| 亚洲激情国产精品|