• <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 米游 閱讀(780) 評論(0)  編輯 收藏 引用 所屬分類: ACM
            A级毛片无码久久精品免费| 国内精品久久久久影院薰衣草| 久久精品人人槡人妻人人玩AV| 久久成人国产精品免费软件| 久久综合久久综合九色| 久久久久无码专区亚洲av| 亚洲一级Av无码毛片久久精品| 一本色道久久88精品综合| 国产美女久久久| 国产成人精品综合久久久| 国产精品美女久久久| 久久国产亚洲精品| 精品无码久久久久久午夜| 久久天天日天天操综合伊人av| 99精品久久久久久久婷婷| 久久久久国产视频电影| 日韩AV无码久久一区二区| 色欲综合久久躁天天躁| 久久久国产乱子伦精品作者| 久久99热这里只频精品6| 国产亚洲色婷婷久久99精品91| 久久A级毛片免费观看| 亚洲色欲久久久久综合网| 大美女久久久久久j久久| 久久久无码人妻精品无码| 久久99热这里只频精品6| 久久人搡人人玩人妻精品首页| 国产精品嫩草影院久久| 亚洲国产精品久久66| 久久久一本精品99久久精品88| 国内精品综合久久久40p| 午夜欧美精品久久久久久久| 中文精品99久久国产| 久久久国产精华液| 久久综合九色欧美综合狠狠| 狠狠综合久久综合中文88| 大香网伊人久久综合网2020| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 精品久久久久久无码专区不卡 | 久久成人国产精品| 国产精品久久久久天天影视|