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

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數據加載中……

HDU 1255 覆蓋的面積

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1255
/*
題意:
    給出N(N <= 1000)個矩形,求被覆蓋2次以上的矩形面積并。

解法:
離散化+線段樹

思路:
    類似于覆蓋一次的矩形面積并問題,還是用線段樹求解,首先我們
將每個矩形的縱向邊投影到Y軸上,這樣就可以把矩形的縱向邊看成一個
閉區間,用線段樹來維護這些矩形邊的并。現在求的是矩形的面積并,
于是可以枚舉矩形的x坐標,然后檢測當前相鄰x坐標上y方向的合法長度,
兩者相乘就是其中一塊面積,枚舉完畢后就求得了所有矩形的面積并。
    我的線段樹結點描述保存了以下信息:區間的左右端點、結點所在
數組編號(因為采用靜態結點可以大大節省申請空間的時間)、該結點
被豎直線段完全覆蓋的次數Cover和當前結點覆蓋一次的y方向長度yOnce
和當前結點覆蓋多次的y方向長度yMore。
    其實和矩形面積并的唯一差別就是在計算Cover后的Update函數,更
新yOnce和yMore的值,分情況討論:
1. 當nCover>1時,yOnce = 0; yMore = 區間實際長度;
2. 當nCover=1時,yMore = 兩棵子樹的yOnce+yMore; 
                 yOnce = 區間實際長度 - yMore;
3. 當nCover=0時,如果是葉子結點 yOnce = 0; yMore = 0;
                 否則 
                 yOnce = 兩棵子樹的yOnce和;
                 yMore = 兩棵子樹的yMore和;
*/


#include 
<iostream>
#include 
<algorithm>
#include 
<vector>
#include 
<cmath>

using namespace std;

#define maxn 2200


double tmp[maxn], bin[maxn];
int tmpsize, size;


struct Tree {
    
int p;
    
int l, r;
    
int nCover;
    
double ylenOnce, ylenMore;

    
void Update() {
        
if(nCover > 1{
            ylenOnce 
= 0;
            ylenMore 
= bin[r] - bin[l];
        }
else if(nCover == 1{
            ylenMore 
= T[p<<1].ylenMore   +   T[p<<1].ylenOnce
                       
+ T[p<<1|1].ylenMore + T[p<<1|1].ylenOnce;            
            
            ylenOnce 
= (bin[r] - bin[l]) - ylenMore;
        }
else {
            
if(l + 1 == r) {
                ylenOnce 
= ylenMore = 0;
            }
else {
                ylenOnce 
= T[p<<1].ylenOnce + T[p<<1|1].ylenOnce;
                ylenMore 
= T[p<<1].ylenMore + T[p<<1|1].ylenMore;
            }

        }

    }

}
T[maxn*4];

struct VLine {
    
double x;
    
double y1, y2;
    
int val;
    VLine() 
{}
    VLine(
double _x, double _y1, double _y2, int _v) {
        x 
= _x;
        y1 
= _y1;
        y2 
= _y2;
        val 
= _v;
    }

}
;
vector 
< VLine > Vl;

bool cmp(VLine a, VLine b) {
    
return a.x < b.x;
}


void Process() {
    sort(tmp, tmp 
+ tmpsize);
    bin[ size 
= 1 ] = tmp[0];
    
for(int i = 1; i < tmpsize; i++{
        
if(fabs(tmp[i] - tmp[i-1]) > 1e-6)
            bin[ 
++size ] = tmp[i];
    }

}


int Binary(double v) {
    
int l = 1;
    
int r = size;

    
while(l <= r) {
        
int m = (l + r) >> 1;
        
if(fabs(v - bin[m]) < 1e-6)
            
return m;
        
if(v > bin[m])
            l 
= m + 1;
        
else
            r 
= m - 1;
    }

}


void Build(int p, int l, int r) {
    T[p].l 
= l;      T[p].r = r;
    T[p].p 
= p;
    T[p].nCover 
= 0; T[p].ylenOnce = T[p].ylenMore = 0;

    
if(l + 1 == r || l == r) {
        
return ;
    }

    
int mid = (l + r) >> 1;
    Build(p
<<1, l, mid);
    Build(p
<<1|1, mid, r);
}


void Insert(int p, int l, int r, int val) {

    
if(r <= T[p].l || l >= T[p].r)
        
return ;

    
if(l <= T[p].l && T[p].r <= r) {
        T[p].nCover 
+= val;
        T[p].Update();
        
return ;
    }


    Insert(p
<<1, l, r, val);
    Insert(p
<<1|1, l, r, val);
    
    T[p].Update();
}

int n;
int main() {
    
int t;
    
int i;
    scanf(
"%d"&t);
    
while(t--{
        tmpsize 
= 0;
        Vl.clear();
        scanf(
"%d"&n);
        
for(i = 0; i < n; i++{
            
double x0, x1, y0, y1;
            scanf(
"%lf %lf %lf %lf"&x0, &y0, &x1, &y1);
            Vl.push_back(VLine(x0, y0, y1, 
1));
            Vl.push_back(VLine(x1, y0, y1, 
-1));
            tmp[ tmpsize
++ ] = y0;
            tmp[ tmpsize
++ ] = y1;
        }


        sort(Vl.begin(), Vl.end(), cmp);
        Process();
        Build(
11, size);
        
double ans = 0;
        
for(i = 0; i < Vl.size(); i++{
            
if(i) {
                ans 
+= (Vl[i].x - Vl[i-1].x) * T[1].ylenMore;
            }

            
int y1 = Binary(Vl[i].y1);
            
int y2 = Binary(Vl[i].y2);
            
if(y1 < y2)
                Insert(
1, y1, y2, Vl[i].val);
        }

        printf(
"%.2lf\n", ans);
    }

    
return 0;
}


posted on 2011-03-30 19:58 英雄哪里出來 閱讀(2484) 評論(1)  編輯 收藏 引用 所屬分類: 線段樹

評論

# re: HDU 1255 覆蓋的面積  回復  更多評論   

受益匪淺,想大牛學習
2011-03-30 21:25 | 菜菜
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲人在线视频| 欧美国产第二页| 久久久久久亚洲综合影院红桃| 野花国产精品入口| 一区二区三区导航| 99国产精品99久久久久久粉嫩| 亚洲精品久久嫩草网站秘色| 亚洲精选久久| 亚洲视频久久| 欧美中文字幕| 欧美大片在线看免费观看| 最新亚洲视频| 亚洲一卡久久| 久久精品一区蜜桃臀影院| 欧美a级理论片| 国产精品久久久久久久久久直播| 国产伦精品一区二区三区照片91 | 亚洲高清一区二区三区| 最近看过的日韩成人| 亚洲一区二区毛片| 久久综合久久美利坚合众国| 欧美喷水视频| 红桃视频成人| 亚洲午夜精品一区二区| 久久久蜜桃一区二区人| 亚洲精品久久久蜜桃| 欧美亚洲三级| 欧美日韩在线播放| 一区在线观看视频| 午夜免费久久久久| 亚洲欧洲综合另类| 久久久亚洲高清| 国产精品人成在线观看免费| 亚洲黄色成人| 老司机一区二区三区| 中国av一区| 欧美美女喷水视频| 最新高清无码专区| 久久午夜av| 午夜精品视频网站| 国产精品美女在线| 亚洲图片你懂的| 亚洲欧洲日韩综合二区| 久久人人爽人人| 国内精品国语自产拍在线观看| 亚洲欧美电影在线观看| 亚洲国产精品福利| 久热爱精品视频线路一| 狠狠色丁香婷婷综合| 久久精品国产一区二区三区| 亚洲一二三区视频在线观看| 亚洲激情第一页| 美女999久久久精品视频| 狠狠色伊人亚洲综合成人| 欧美一区二区三区视频| 亚洲一区二区三区在线播放| 国产精品成人一区二区艾草| 一卡二卡3卡四卡高清精品视频| 欧美电影在线观看完整版| 久久久精品网| 亚洲第一精品影视| 免费中文字幕日韩欧美| 久久美女性网| 亚洲国产成人久久综合一区| 免费欧美在线| 你懂的国产精品| 亚洲激情女人| 亚洲日本成人网| 欧美日韩精品免费观看视频| 一区二区欧美激情| 一区二区三区高清视频在线观看| 欧美午夜免费电影| 欧美一区观看| 久久男人资源视频| 日韩视频三区| 亚洲影视综合| 精品动漫一区| 亚洲精选成人| 国产午夜精品理论片a级探花| 久久久久综合| 蜜臀av在线播放一区二区三区 | 国产综合在线看| 欧美va亚洲va日韩∨a综合色| 欧美成年视频| 亚洲一级在线| 久久国产精品亚洲va麻豆| 亚洲激情社区| 亚洲天天影视| 亚洲国产视频一区二区| 一区二区三区日韩精品视频| 国产日韩精品电影| 欧美激情久久久| 国产精品成人一区二区网站软件 | 欧美一区二区三区视频在线观看 | 亚洲国产精品传媒在线观看| 欧美三级视频在线播放| 久久精品免费电影| 欧美精品在线免费| 久久一区亚洲| 国产精品乱码一区二区三区| 欧美激情视频一区二区三区在线播放 | 亚洲一区中文| 亚洲茄子视频| 欧美一区二区三区喷汁尤物| 免费观看成人www动漫视频| 亚洲欧美日韩爽爽影院| 狂野欧美一区| 久久国产色av| 国产精品成人一区二区三区夜夜夜| 麻豆国产精品777777在线| 欧美日韩国产成人| 免费欧美网站| 国产日韩在线一区| 一本色道久久88精品综合| 亚洲国产欧洲综合997久久| 亚洲欧美视频| 亚洲欧美www| 欧美日韩第一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美午夜视频网站| 亚洲精品国产系列| 最新中文字幕一区二区三区| 欧美一区二粉嫩精品国产一线天| 亚洲网站在线播放| 欧美精品自拍| 亚洲人在线视频| 亚洲国产欧美在线人成| 久久xxxx精品视频| 久久精品国产亚洲一区二区三区| 欧美天天综合网| av成人免费| 99视频超级精品| 欧美成人亚洲成人日韩成人| 久久久久一区二区| 激情视频一区| 老色鬼精品视频在线观看播放| 久久午夜电影网| 极品少妇一区二区三区| 久久爱www久久做| 欧美1区3d| 亚洲欧洲日夜超级视频| 欧美激情在线免费观看| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲人成小说网站色在线| 亚洲激情在线观看视频免费| 久久综合99re88久久爱| 欧美成人黑人xx视频免费观看| 今天的高清视频免费播放成人 | 亚洲精品久久久蜜桃| 亚洲精选视频免费看| 欧美激情精品久久久久| 一区二区三区日韩| 欧美三区视频| 亚洲一区免费观看| 久久免费视频网| 亚洲精品午夜| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲视频每日更新| 国产精品久久久久久影视| 亚洲欧美久久| 欧美成人精品一区| 亚洲图中文字幕| 国产在线不卡视频| 欧美岛国在线观看| 亚洲私人影院在线观看| 久久综合给合久久狠狠狠97色69| 亚洲国产老妈| 国产精品毛片一区二区三区| 久久成人精品无人区| 亚洲缚视频在线观看| 欧美亚洲尤物久久| 亚洲二区三区四区| 国产精品成人va在线观看| 久久精品成人一区二区三区蜜臀| 欧美激情网站在线观看| 亚洲欧美日本在线| 亚洲韩国一区二区三区| 国产精品v亚洲精品v日韩精品| 午夜伦欧美伦电影理论片| 美女日韩欧美| 香蕉乱码成人久久天堂爱免费| 亚洲第一级黄色片| 国产精品稀缺呦系列在线| 女主播福利一区| 午夜精品久久久久久久久久久| 欧美成年人视频网站| 欧美一区二区三区播放老司机| 亚洲日产国产精品| 国内精品久久久久影院薰衣草| 欧美日韩你懂的| 久久视频免费观看| 亚洲欧美日韩精品久久奇米色影视| 亚洲国产成人porn| 狼人社综合社区| 久久国产一区| 性欧美长视频| 午夜精品福利一区二区三区av | 91久久精品国产91性色| 欧美伊人久久久久久午夜久久久久 | 欧美精品色一区二区三区|