• <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>
            隨筆-38  評論-23  文章-0  trackbacks-0
            /*
            Author:miyou
            PROG:the perimeter of many rectangles
            LANG:C++
            */

            #include
            <iostream>
            #include
            <vector>
            #include
            <algorithm>
            using namespace std;
            #define MAXN 1000000
            const __int64 mininf=1000000;
            const __int64 maxinf=-1000000;
            struct Line
            {
                __int64 count,len;
            //count 記錄線段覆蓋次數(shù),len 該段線段長度
                __int64 l,r;//線段左右兩端點
                int lbc,rbc;//線段左右兩端點被覆蓋的次數(shù),0表示未被覆蓋
                __int64 nseg;//該線段中連續(xù)線段個數(shù).
            }
            ;
            struct node
            {
                __int64 x,down,up;
            //掃描線,down 線的下端點,up 線的上端點,x掃描線的x位置
                bool flag;//表示是矩形的左邊線還是右邊線
                node(__int64 tx,__int64 td,__int64 tu,bool tf):x(tx),down(td),up(tu),flag(tf)
                
            {
                }

            }
            ;
            __int64 miny,maxy;
            vector
            < node > vec;
            Line Ltree[MAXN];
            bool operator< (const node& a,const node& b)
            {
                
            return a.x<b.x;
            }

            void build(__int64 l,__int64 r,int step)
            {
                Ltree[step].count
            =0;Ltree[step].len=0;
                Ltree[step].lbc
            =false;Ltree[step].rbc=false;
                Ltree[step].nseg
            =0;
                Ltree[step].r
            =r;Ltree[step].l=l;
                
            if(r-l>1)
                
            {
                    build(l,(l
            +r)/2,2*step);
                    build((l
            +r)/2,r,2*step+1);
                }

            }

            void update(int step)
            {
                
            if(Ltree[step].count>0)
                
            {
                    Ltree[step].len
            =Ltree[step].r-Ltree[step].l;
                    Ltree[step].nseg
            =1;
                }

                
            else
                    
            if(Ltree[step].r-Ltree[step].l>1)
                    
            {
                        Ltree[step].len
            =Ltree[2*step].len+Ltree[2*step+1].len;
                        Ltree[step].nseg
            =Ltree[2*step].nseg+Ltree[2*step+1].nseg;
                        
            if(Ltree[step].nseg&&Ltree[2*step].rbc&&Ltree[2*step+1].lbc)
                            Ltree[step].nseg
            --;
                    }

                    
            else
                    
            {
                        Ltree[step].len
            =0;
                        Ltree[step].nseg
            =0;
                    }

            }

            void insert(__int64 l,__int64 r,int step)
            {
                
            if(Ltree[step].l==l) Ltree[step].lbc++;
                
            if(Ltree[step].r==r) Ltree[step].rbc++;
                
            if(l==Ltree[step].l&&Ltree[step].r==r)
                    Ltree[step].count
            ++;
                
            else
                
            {
                    __int64 mid
            =(Ltree[step].l+Ltree[step].r)/2;
                    
            if(r<=mid)
                        insert(l,r,
            2*step);
                    
            else 
                        
            if(l>=mid)
                            insert(l,r,
            2*step+1);
                        
            else
                        
            {
                            insert(l,mid,
            2*step);
                            insert(mid,r,
            2*step+1);
                        }

                }

                update(step);
            }

            void del(__int64 l,__int64 r,int step)
            {
                
            if(Ltree[step].l==l) Ltree[step].lbc--;
                
            if(Ltree[step].r==r) Ltree[step].rbc--;
                
            if(l==Ltree[step].l&&Ltree[step].r==r)
                    Ltree[step].count
            --;
                
            else
                
            {
                    __int64 mid
            =(Ltree[step].l+Ltree[step].r)/2;
                    
            if(r<=mid)
                        del(l,r,
            2*step);
                    
            else 
                        
            if(l>=mid)
                            del(l,r,
            2*step+1);
                        
            else
                        
            {
                            del(l,mid,
            2*step);
                            del(mid,r,
            2*step+1);
                        }

                }

                update(step);
            }


            int main()
            {
                
            int n;
                __int64 x1,x2,y1,y2;
                
            while(scanf("%d",&n)==1)
                
            {
                    miny
            =mininf;
                    maxy
            =maxinf;
                    
            for(int i=0;i<n;i++)
                    
            {
                        scanf(
            "%I64d%I64d%I64d%I64d",&x1,&y1,&x2,&y2);
                        vec.push_back(node(x1,y1,y2,
            true));
                        vec.push_back(node(x2,y1,y2,
            false));
                        miny
            =min(miny,y1);
                        maxy
            =max(maxy,y2);
                    }

                    sort(vec.begin(),vec.end());
                    
            //cout<<miny<<" "<<maxy<<endl;
                    build(miny,maxy,1);
                    __int64 peri
            =0;
                    
            int m=vec.size();
                    __int64 lastlen
            =0,lastseg=0;
                    
            for(int i=0;i<m;i++)
                    
            {
                        
            if(vec[i].flag)
                            insert(vec[i].down,vec[i].up,
            1);
                        
            else
                            del(vec[i].down,vec[i].up,
            1);
                        peri
            +=abs(Ltree[1].len-lastlen);
                        
            //cout<<"len:"<<Ltree[1].len<<endl;
                        lastlen=Ltree[1].len;
                        
            if(i)
                            peri
            +=2*(vec[i].x-vec[i-1].x)*lastseg;
                        lastseg
            =Ltree[1].nseg;
                        
            //cout<<"seg:"<<Ltree[1].nseg<<endl;
                    }

                    printf(
            "%I64d\n",peri);
                }

                
            return 0;
            }



            posted on 2009-05-03 21:02 米游 閱讀(782) 評論(0)  編輯 收藏 引用 所屬分類: ACM
            久久久精品免费国产四虎| 久久精品国产亚洲AV不卡| 欧美日韩精品久久免费| 久久亚洲AV成人无码软件| 日日噜噜夜夜狠狠久久丁香五月| 色婷婷综合久久久久中文| 香港aa三级久久三级| 97精品国产97久久久久久免费| 国产精品久久精品| 久久精品国产欧美日韩99热| 成人国内精品久久久久一区| 久久久久久免费视频| 久久综合久久久| 蜜臀久久99精品久久久久久小说 | 国产免费久久精品丫丫| 亚洲国产日韩欧美综合久久| 亚洲国产精品一区二区久久| 亚洲va中文字幕无码久久不卡| 人人狠狠综合久久亚洲| 久久精品国产秦先生| 亚洲国产精品无码成人片久久| 亚洲国产精品无码久久青草| 日本三级久久网| 精品久久久久久| 东京热TOKYO综合久久精品 | 香蕉99久久国产综合精品宅男自 | 人妻少妇久久中文字幕| 精品国产青草久久久久福利 | 日本精品久久久久中文字幕8| 亚洲国产精品无码久久SM| 久久人人爽人人爽人人爽| 中文精品久久久久人妻| 性做久久久久久久久| 午夜视频久久久久一区| 亚洲精品成人网久久久久久| 久久久网中文字幕| 香蕉99久久国产综合精品宅男自 | 久久九九久精品国产免费直播| 亚洲国产精品久久久久婷婷老年 | 中文精品99久久国产| 久久伊人五月丁香狠狠色|