• <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>
            隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
            數(shù)據(jù)加載中……

            PKU 1151 Atlantis

            題目鏈接:http://poj.org/problem?id=1151
            /*
            題意:
                給定n(n <= 100)個矩形,求它們的面積并。

            解法:
            離散化+線段樹 或者 離散化+FloodFill

            思路:
                數(shù)據(jù)量很小,直接把浮點數(shù)離散成整點,然后暴力FloodFill,最后統(tǒng)計
            覆蓋的塊的實際面積。
                也可以采用線段樹,具體解法如下面這題:
            http://www.shnenglu.com/menjitianya/archive/2011/03/29/142972.html
            */


            #include 
            <iostream>
            #include 
            <algorithm>
            #include 
            <vector>
            #include 
            <cmath>
            using namespace std;

            #define eps 1e-6
            #define maxn 100000
            // 垂直x軸的線段
            struct VLine {
                
            double x;
                
            double y1, y2;  // y1 <= y2
                int val;        // in or out
                VLine() {}
                VLine(
            double _x, double _y1, double _y2, int _v) {
                    x 
            = _x;
                    y1 
            = _y1;
                    y2 
            = _y2;
                    val 
            = _v;
                }

            }
            ;
            vector 
            <VLine> Inc;
            double tmp[maxn], bin[maxn];
            int tmpsize, binsize;

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


            void preBinaryProcess() {
                sort(tmp, tmp 
            + tmpsize);
                binsize 
            = 0;
                bin[ 
            ++binsize ] = tmp[0];
                
            int i;
                
            for(i = 1; i < tmpsize; i++{
                    
            if(fabs(tmp[i] - tmp[i-1]) > eps)
                        bin[ 
            ++binsize ] = tmp[i];
                }

            }


            int Binary(double val) {
                
            int l = 1;
                
            int r = binsize;
                
            int m;
                
            while(l <= r) {
                    m 
            = (l + r) >> 1;
                    
            if(fabs(val - bin[m]) < eps)
                        
            return m;
                    
            if(val > bin[m]) {
                        l 
            = m + 1;
                    }
            else
                        r 
            = m - 1;
                }


            }


            struct Tree {
                
            int nCover;   // 當(dāng)前線段被完全覆蓋了幾次
                double yLen;  // 測度、相鄰掃描線間y方向的有效長度
                int l, r;     // 線段樹該結(jié)點管理的區(qū)間
                int nowIndex; // 當(dāng)前結(jié)點所在的數(shù)組下標(biāo)

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

                    }

                }


                
            int GetMid() {
                    
            return (l + r) >> 1;
                }

            }
            T[maxn*4];

            void Build(int p, int l, int r) {
                T[p].nCover 
            = T[p].yLen = 0;
                T[p].l 
            = l; T[p].r = r;
                T[p].nowIndex 
            = p;
                
            if(l == r || l + 1 == 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(l <= T[p].l && T[p].r <= r) {
                    T[p].nCover 
            += val;
                    T[p].Update();
                    
            return ;
                }


                
            int mid = T[p].GetMid();
                
            if(l < mid) {
                    Insert(p
            <<1, l, r, val);
                }

                
            if(r > mid) {
                    Insert(p
            <<1|1, l, r, val);
                }

                T[p].Update();
            }


            int n;
            int main() {
                
            int i;
                
            int Case = 1;
                
            while(scanf("%d"&n) != EOF && n) {
                    Inc.clear();
                    tmpsize 
            = binsize = 0;
                    
            for(i = 0; i < n; i++{
                        
            double x1, y1, x2, y2;
                        scanf(
            "%lf %lf %lf %lf"&x1, &y1, &x2, &y2);
                        Inc.push_back(VLine(x1, y1, y2, 
            1));
                        Inc.push_back(VLine(x2, y1, y2, 
            -1));
                        tmp[ tmpsize
            ++ ] = y1;
                        tmp[ tmpsize
            ++ ] = y2;
                    }

                    sort(Inc.begin(), Inc.end(), cmp);
                    preBinaryProcess();
                    Build(
            11, binsize);

                    
            double ans = 0;
                    
            for(i = 0; i < Inc.size(); i++{
                        
            int y1 = Binary(Inc[i].y1);
                        
            int y2 = Binary(Inc[i].y2);
                        
            if(y1 == y2)
                            
            continue;
                        
            if(i)
                            ans 
            += (Inc[i].x - Inc[i-1].x) * T[1].yLen;
                        Insert(
            1, y1, y2, Inc[i].val);
                    }

                    printf(
            "Test case #%d\nTotal explored area: %.2lf\n\n", Case++, ans);
                }

                
            return 0;
            }

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

            久久九九久精品国产免费直播| 久久久一本精品99久久精品88| 亚洲综合精品香蕉久久网97| 久久九九亚洲精品| 四虎久久影院| 久久午夜伦鲁片免费无码| 女人香蕉久久**毛片精品| 欧美一区二区久久精品| 丰满少妇人妻久久久久久| 国产免费久久精品丫丫| 亚洲精品乱码久久久久久| 日本精品久久久久中文字幕8 | 久久久久亚洲精品无码网址 | 亚洲国产精品综合久久网络| 亚洲AV无码久久精品成人| 久久九九久精品国产| 91精品国产乱码久久久久久 | 久久这里有精品视频| 国内精品久久久久久99| 精品久久久久久久久久久久久久久| 日日躁夜夜躁狠狠久久AV| 色欲综合久久躁天天躁| 国产ww久久久久久久久久| 久久精品午夜一区二区福利| 香蕉久久夜色精品国产2020| 久久久精品久久久久久| 国产精品久久久久久久午夜片 | 亚洲人AV永久一区二区三区久久| www久久久天天com| 丁香狠狠色婷婷久久综合| 久久综合狠狠综合久久| 亚洲国产欧美国产综合久久| 中文成人无码精品久久久不卡 | 久久久久亚洲AV成人网| 亚洲欧美日韩精品久久| 久久精品黄AA片一区二区三区| 一本一本久久A久久综合精品 | 久久成人影院精品777| 国产一级持黄大片99久久| 久久香蕉一级毛片| 91久久九九无码成人网站|