• <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>

            C小加

            厚德 博學(xué) 求真 至善 The bright moon and breeze
            posts - 145, comments - 195, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            NYOJ地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=9
            題意:往區(qū)間[1, 10000000]的墻上貼海報(bào),海報(bào)數(shù)量的區(qū)間是[1,10000],后貼的會(huì)覆蓋之前的,問最后能看到的海報(bào)數(shù)量。
            思路:離散化+并查集。張?jiān)坡攲W(xué)長的方法,寫著很給力啊,效率要比線段樹高。離散化后從最后一張海報(bào)開始,把每一段的根節(jié)點(diǎn)都置為海報(bào)的起始節(jié)點(diǎn),這樣下一張海報(bào)訪問任何一節(jié)點(diǎn)的時(shí)候都會(huì)直接訪問到根節(jié)點(diǎn),節(jié)省了訪問次數(shù)。

            #include 
            <iostream>
            #include 
            <cstdio>
            #include 
            <algorithm>
            #include 
            <cstring>
            using namespace std;
            const int MAXN=30003;
            inline 
            int L(int r){return r<<1;}
            inline 
            int R(int r){return ((r<<1)+1);}
            inline 
            int MID(int l,int r) {return (l+r)>>1;}

            typedef 
            struct NODE
            {
                
            int value,zy;
                
            bool operator < (const NODE& r) const
                {
                    
            return value<r.value;
                }
            }NODE;
            NODE node[MAXN];
            int post[MAXN][2];
            int f[MAXN];
            bool cnt[MAXN];
            int sum;
            int find(int x)
            {
                
            return f[x]==-1?x:f[x]=find(f[x]);
            }

            int main()
            {
                
            //freopen("input","r",stdin);
                int t;
                scanf(
            "%d",&t);
                
            while(t--)
                {
                    
            int n;
                    scanf(
            "%d",&n);
                    
            for(int i=0;i<n;i++)
                    {
                        scanf(
            "%d%d",&post[i][0],&post[i][1]);//當(dāng)前post為左右界坐標(biāo)真值
                        node[L(i)].zy=-i-1;//左值為負(fù)
                        node[R(i)].zy=i+1;//右值為正
                        node[L(i)].value=post[i][0];//把左右界坐標(biāo)真值儲存在結(jié)構(gòu)體數(shù)組中
                        node[R(i)].value=post[i][1];
                    }
                    sort(node,node
            +n*2);//對所有坐標(biāo)進(jìn)行排序
                    int count=1,temp=node[0].value;//count為離散化后坐標(biāo)值。
                    for(int i=0;i<2*n;i++)
                    {
                        
            if(node[i].value!=temp)//如果坐標(biāo)不同,則坐標(biāo)加1
                        {
                            count
            ++;
                            temp
            =node[i].value;
                            
            if(i!=0)         //空隙處理,寫的不是很好
                            if(node[i-1].zy>0)
                            
            if((node[i-1].value+1)!=node[i].value)
                            count
            ++;
                        }

                        
            if(node[i].zy<0) post[-node[i].zy-1][0]=count;//新post為離散化過后,左右界值
                        else post[node[i].zy-1][1]=count;
                    }

                    memset(f,
            -1,sizeof(f));
                    memset(cnt,
            0,sizeof(cnt));
                    sum
            =0;
                    
            bool flag=0;
                    
            int l,r;
                    
            for(int i=n-1;i>=0;i--//從最后一張海報(bào)開始
                    {
                        l
            =find(post[i][0]);//如果起點(diǎn)已經(jīng)被覆蓋,就找到已覆蓋的最左端的節(jié)點(diǎn)。
                        for(int j=post[i][1];j>=post[i][0];j=r-1)
                        {
                            r
            =find(j);// 如果節(jié)點(diǎn)已被覆蓋,找到已覆蓋最左端的節(jié)點(diǎn)
                            if(!cnt[r]) //如果此節(jié)點(diǎn)沒有被覆蓋
                            {
                                cnt[r]
            =1;
                                flag
            =1;
                            }
                            
            if(l!=r) f[r]=l; //每次讓右端的節(jié)點(diǎn)都指向最左端的節(jié)點(diǎn),下次訪問的時(shí)候會(huì)直接跳到最左端的節(jié)點(diǎn)
                        }
                        
            if(flag)sum++;
                        flag
            =0;
                    }
                    printf(
            "%d\n",sum);


                }
                
            return 0;
            }
            要久久爱在线免费观看| 国产成人精品免费久久久久| 久久se精品一区精品二区| 色青青草原桃花久久综合| 久久久久久噜噜精品免费直播| 国产亚洲色婷婷久久99精品91| 久久99国产精品久久久| 国产精品久久久久久久久免费| 久久久久人妻一区精品色| 久久国产精品一国产精品金尊| 人妻无码久久一区二区三区免费| 久久天天躁狠狠躁夜夜躁2014| 久久狠狠爱亚洲综合影院| 久久99精品国产麻豆宅宅| 亚洲中文久久精品无码| 麻豆成人久久精品二区三区免费| 国产美女久久精品香蕉69| 热99re久久国超精品首页| 欧美久久一区二区三区| 久久夜色精品国产欧美乱| 久久成人影院精品777| 久久996热精品xxxx| 国产色综合久久无码有码| 久久91精品久久91综合| 亚洲欧美另类日本久久国产真实乱对白| 久久久国产打桩机| 日韩欧美亚洲综合久久影院d3| 久久亚洲天堂| 久久精品无码专区免费东京热 | 久久久无码精品亚洲日韩按摩| 国产精品一久久香蕉产线看| 久久久久这里只有精品 | 精品国产乱码久久久久软件| 日本强好片久久久久久AAA| 国产高清国内精品福利99久久| 亚洲色欲久久久久综合网| 精品永久久福利一区二区| 青春久久| www亚洲欲色成人久久精品| 少妇久久久久久久久久| 精品久久久久久无码中文字幕 |