• <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 記錄線段覆蓋次數,len 該段線段長度
                __int64 l,r;//線段左右兩端點
                int lbc,rbc;//線段左右兩端點被覆蓋的次數,0表示未被覆蓋
                __int64 nseg;//該線段中連續線段個數.
            }
            ;
            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 米游 閱讀(772) 評論(0)  編輯 收藏 引用 所屬分類: ACM
            亚洲国产精品狼友中文久久久| 亚洲人成网站999久久久综合| 久久午夜福利无码1000合集| 日本一区精品久久久久影院| 久久精品国产亚洲av影院| 亚洲国产欧洲综合997久久| 久久SE精品一区二区| 国产69精品久久久久APP下载| 性高湖久久久久久久久AAAAA| 人人狠狠综合88综合久久| 久久精品这里只有精99品| 久久强奷乱码老熟女| 精品视频久久久久| 午夜视频久久久久一区| 国产69精品久久久久APP下载| 欧美牲交A欧牲交aⅴ久久| 99精品国产在热久久无毒不卡| 久久久久国产精品| 久久夜色精品国产| 久久人妻无码中文字幕| 国产婷婷成人久久Av免费高清| 久久久青草青青亚洲国产免观| 国产精品青草久久久久福利99 | 精品久久久久久无码中文字幕一区 | 亚洲人成无码www久久久| 亚洲中文久久精品无码| 国产一区二区三区久久| 欧美亚洲日本久久精品| 亚洲精品无码专区久久久| 99久久无色码中文字幕| 免费精品国产日韩热久久| 久久国产色AV免费观看| 久久久精品日本一区二区三区| 久久久无码精品亚洲日韩蜜臀浪潮| 99re久久精品国产首页2020| 精品久久久久久久中文字幕| 99精品国产99久久久久久97| 91麻精品国产91久久久久| 国产一区二区久久久| 亚洲国产成人久久综合碰碰动漫3d | 久久精品中文字幕大胸|