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

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個頂點的坐標就可以了(最左下,最右上)??梢杂?個數組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 閱讀(278) 評論(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>
            欧美国产日本| 国产女优一区| 亚洲人成网在线播放| 乱中年女人伦av一区二区| 久久精品国产欧美激情| 1000精品久久久久久久久| 欧美黄色免费| 欧美日韩在线免费| 欧美一区二区播放| 亚洲一区二区三区成人在线视频精品| 国产精品理论片| 久久久久国产一区二区三区四区| 久久精品亚洲热| 亚洲精品一区二区在线观看| 亚洲日本欧美天堂| 国产精品亚洲аv天堂网| 久久人人爽人人爽| 欧美精品一区二区视频| 欧美一级精品大片| 美腿丝袜亚洲色图| 亚洲欧美电影院| 久久精品欧美日韩精品| 日韩视频中文字幕| 午夜宅男欧美| 9久草视频在线视频精品| 亚洲女同在线| 亚洲福利国产| 在线亚洲一区二区| 国产综合色一区二区三区| 亚洲国产成人精品久久| 国产欧美日韩三级| 亚洲人成在线观看一区二区| 国产乱码精品一区二区三区五月婷| 老色鬼精品视频在线观看播放| 欧美日韩美女一区二区| 模特精品在线| 国产欧美日韩精品一区| 亚洲人成在线播放| 亚洲第一天堂av| 亚洲欧美日本伦理| 亚洲最新色图| 另类天堂av| 久久网站免费| 国产噜噜噜噜噜久久久久久久久 | 欧美日韩不卡一区| 久久中文字幕一区| 国产精品丝袜xxxxxxx| 亚洲国产精品一区二区www在线| 国产日韩精品在线| 日韩视频在线免费观看| 亚洲激情另类| 久久免费国产精品| 久久久久久一区二区三区| 国产精品久久久久77777| 91久久精品国产| 亚洲激情图片小说视频| 久久久另类综合| 久久久水蜜桃| 黄色成人在线| 久久国产视频网| 久久国产精品久久久| 国产精品色网| 亚洲专区欧美专区| 欧美一区二区黄色| 国产伦一区二区三区色一情| 亚洲天堂免费观看| 欧美一区成人| 国产亚洲一级高清| 欧美在线观看视频一区二区三区| 欧美一区二区性| 国产精品一二三| 亚洲欧美日韩一区二区三区在线| 亚洲欧美日韩在线不卡| 国产美女一区二区| 欧美有码在线视频| 久久人人爽人人爽| 亚洲国产岛国毛片在线| 女人色偷偷aa久久天堂| 亚洲国产视频直播| 中日韩视频在线观看| 欧美视频国产精品| 亚洲欧美日韩一区在线| 久久青草久久| 亚洲激情在线观看| 欧美日韩视频不卡| 亚洲欧美www| 免费在线亚洲欧美| 一区二区日韩| 国产精品一区二区三区四区| 欧美中文在线观看国产| 亚洲大胆视频| 亚洲永久免费视频| 国产在线观看91精品一区| 久久婷婷久久一区二区三区| 91久久在线观看| 欧美一级免费视频| 亚洲韩日在线| 国产精品手机视频| 你懂的网址国产 欧美| 99精品热6080yy久久| 久久久精品国产免大香伊| 亚洲国产精品v| 国产精品久久久久久久久久三级| 久久国产加勒比精品无码| 亚洲黄色三级| 久久久国产亚洲精品| 夜色激情一区二区| 国内精品免费在线观看| 欧美日韩专区| 免费成人av在线看| 午夜精品国产精品大乳美女| 欧美激情中文字幕乱码免费| 性伦欧美刺激片在线观看| 91久久亚洲| 韩国亚洲精品| 国产精品卡一卡二| 欧美巨乳在线观看| 久久人91精品久久久久久不卡| 亚洲天堂免费观看| 亚洲国产小视频在线观看| 欧美一区二区三区在线看| 日韩一区二区精品视频| 激情综合网激情| 国产日韩欧美不卡在线| 欧美性猛交xxxx免费看久久久| 免费亚洲网站| 久久久综合免费视频| 欧美一区二区精品| 亚洲欧美一区二区激情| 99视频有精品| 亚洲精品日韩精品| 91久久精品一区| 亚洲福利视频一区| 欧美粗暴jizz性欧美20| 久久久人成影片一区二区三区| 欧美一区观看| 欧美专区第一页| 欧美一级播放| 久久国产精品色婷婷| 欧美亚洲三区| 久久国产精品久久精品国产| 午夜精品免费在线| 午夜一区二区三区不卡视频| 亚洲一区一卡| 亚洲欧美日本伦理| 性色av一区二区怡红| 欧美一区二区成人| 久久国产精品亚洲va麻豆| 久久黄金**| 久久久久久久999| 裸体歌舞表演一区二区| 欧美成人自拍视频| 亚洲电影第三页| 91久久久精品| 一区二区三区日韩欧美精品| 一本色道久久综合亚洲精品按摩| 一区二区欧美日韩视频| 亚洲欧美乱综合| 久久精品av麻豆的观看方式| 久久久久国色av免费观看性色| 久久亚洲春色中文字幕| 欧美成人免费全部观看天天性色| 欧美电影在线免费观看网站| 欧美乱在线观看| 国产精品免费一区二区三区在线观看| 国产精品理论片| 韩国一区二区三区美女美女秀| 亚洲国产日韩美| 亚洲视频网在线直播| 久久se精品一区二区| 美女啪啪无遮挡免费久久网站| 欧美激情中文不卡| 亚洲天堂久久| 久久婷婷麻豆| 欧美午夜免费电影| 亚洲第一页在线| 亚洲专区免费| 欧美a级片网站| 一本色道久久88精品综合| 欧美中文在线观看国产| 欧美激情女人20p| 国产深夜精品福利| 99热这里只有精品8| 久久9热精品视频| 91久久精品日日躁夜夜躁国产| 亚洲女同同性videoxma| 开元免费观看欧美电视剧网站| 欧美视频一区二区三区在线观看| 一区二区三区在线看| 亚洲综合电影| 欧美激情第4页| 亚洲欧美日韩一区二区三区在线观看 | 欧美成人资源| 亚洲综合日韩中文字幕v在线| 可以看av的网站久久看| 国产美女扒开尿口久久久| 日韩视频一区二区三区| 久久人人爽爽爽人久久久| 亚洲天堂成人| 欧美黄网免费在线观看|