• <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>
            算法學(xué)社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0

            題目描述:

                定義區(qū)間的交,并,差操作。假設(shè)當(dāng)前坐標(biāo)軸區(qū)間集合為S(開始為空),給大量的詢問,格式為 命令+區(qū)間T,命令'I'代表S = S交T,'U'代表并,D和C代表S=S-T和S=T-S,S代表S=S-T并T-S。輸出最后的區(qū)間集合S。

            吐槽:

                1. 從昨天下午做到今天晚上... 好吧我承認(rèn)我弱
                2. 一開始沒有用延時(shí)操作,記錄了每個(gè)操作的時(shí)間,最后離線處理。然后我抓狂了....
                3. 后來改用樸素版線段樹,寫著寫著發(fā)現(xiàn)這些不是用zkw版線段樹也能實(shí)現(xiàn)么... 然后就調(diào)到了今天晚上...
                4. 由于實(shí)現(xiàn)的關(guān)系,運(yùn)行速度與樸素版旗鼓相當(dāng)..........

            算法描述:

                首先將L和R乘以2以解決開閉區(qū)間的問題....
                
                剩下的其實(shí)就是線段覆蓋問題:
                    1. U: 將[L,R]賦值為1
                    2. I: 將[0,L-1] 和 [R+1,MAXN]賦值為0
                    3. D: 將[L,R]賦值為0
                    4. S: 將[L,R]里的所有值取反
                    5. C: 將[L,R]里的所有值取反,并且將[0,L-1]和[R+1,MAXN]賦值為0
                賦值那部分就不講了.... 主要是取反,用到線段樹的延時(shí)操作,然后再下次訪問的時(shí)候向下更新(樸素版的思路)
                其實(shí)zkw版可以先預(yù)處理一下,就是將1到L-1的點(diǎn)順次更新一遍(因?yàn)樵谏厦娴牟僮骺隙ㄊ呛蠹拥?,然后將1到R+1的點(diǎn)順次更新一遍。
                這樣做一定可以將需要維護(hù)的節(jié)點(diǎn)預(yù)先更新一遍...
                
                最后統(tǒng)計(jì)的時(shí)候掃一遍就可以了...
                ms比樸素版還是好寫一些的...
             1 #include<iostream>
             2 #include<cassert>
             3 #include<cstring>
             4 #include<cstdio>
             5 using namespace std;
             6 #define re(i,n) for(int i=0;i<n;i++)
             7 #define re1(i,n) for(int i=1;i<=n;i++)
             8 #define re2(i,n) for(int i=0;i<=n;i++)
             9 #define re3(i,n) for(int i=1;i<n;i++)
            10 #define debug1
            11 const int V = 66000*2;
            12 int M;
            13 struct node{
            14     int color,x;
            15     node(){color=x=0;}
            16 } seg[V*4];
            17 void solve(int x){
            18     if(seg[x].color!=-1) seg[x].color ^= 1;
            19     else seg[x].x ^= 1;
            20 }
            21 void upt(int x){
            22     if(x==1) return;
            23     upt(x>>1);
            24     if(x >M) return;
            25     if(seg[x].color!=-1){
            26         seg[x<<1].color = seg[x<<1|1].color = seg[x].color;
            27         seg[x<<1].x = seg[x<<1|1].x =0;
            28         seg[x].color = -1;
            29     }
            30     if(seg[x].x){
            31         solve(x <<1);
            32         solve(x <<1|1);
            33         seg[x].x = 0;
            34     }
            35 }
            36 void ins(int l,int r,int p,int c=0){
            37     if(l>r) return;
            38     l = M+l; r = M+r+2;
            39     upt(l); upt(r);
            40     for(;l^r^1;l>>=1,r>>=1){
            41         if(l&1^1) if(p) solve(l^1); else seg[l^1].color = c, seg[l^1].x = 0;
            42         if(r&1) if(p) solve(r^1); else seg[r^1].color = c, seg[r^1].x = 0;
            43     }
            44 }
            45 inline void OP(int l,int r){
            46     printf("%c%d,%d%c ", l&1 ? '(':'[', l>>1 , r&1 ? r+1>>1: r>>1, r&1?')':']');
            47 }
            48 int main(){
            49     char cmd[2];
            50     int l,r;char x,y;
            51     re(i,30) if((1<<i) > V) {M = 1<<i; break;}
            52     while(~scanf("%s %c%d,%d%c",cmd,&x,&l,&r,&y)){
            53     //    printf("%s %s\n",cmd,ch);
            54         l<<=1,r<<=1; if(x=='(') l++; if(y==')') r--;
            55         switch(cmd[0]){
            56             case 'U': 
            57                 ins(l,r,0,1); break;
            58             case 'I': 
            59                 ins(0,l-1,0,0); ins(r+1,V,0,0); break;
            60             case 'C': 
            61                 ins(l,r,1); ins(0,l-1,0,0); ins(r+1,V,0,0); break;
            62             case 'D': ins(l,r,0,0); break;
            63             case 'S': ins(l,r,1); break;
            64         }
            65     }
            66     int flag = 0,f = 0;
            67     for(int i = M+1;i<M+V;i++){
            68         upt(i);
            69         if(seg[i].color){
            70             if(flag) ++r;
            71             else r=l=i,flag=1;
            72         }
            73         else if(flag){
            74             f = 1;
            75             OP(l-M-1,r-M-1);
            76             flag = 0;
            77         }
            78     }
            79     if(!f) puts("empty set"); else
            80     puts("");
            81 }
            82 
            posted on 2012-05-07 20:21 西月弦 閱讀(1655) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 解題報(bào)告經(jīng)典題目
            99久久国产综合精品网成人影院| 无码精品久久久久久人妻中字 | 久久久这里有精品| 中文成人久久久久影院免费观看| 狠狠色综合网站久久久久久久| 亚洲欧美成人久久综合中文网 | 久久久久久国产精品免费免费| 日本精品一区二区久久久| 久久久www免费人成精品| 久久99国产精品久久| 性高朝久久久久久久久久| 久久无码人妻一区二区三区| 久久久久亚洲av毛片大| 精品久久久久久无码专区不卡| 久久精品无码一区二区三区日韩| 精品久久久久久中文字幕大豆网 | 综合久久一区二区三区| 国产成人久久激情91| 色综合久久夜色精品国产| 久久国产精品久久| 久久高清一级毛片| 久久最新免费视频| 久久精品亚洲中文字幕无码麻豆 | 国产精品久久久久久久久软件| 国产91久久精品一区二区| 久久天天躁狠狠躁夜夜不卡| 久久久人妻精品无码一区| 日韩欧美亚洲综合久久影院d3| 国内精品久久久久久久久电影网| 久久精品国产一区二区三区| 久久精品免费观看| 久久99精品国产麻豆宅宅| 久久99精品久久久久久动态图| 亚洲国产精品无码久久青草 | 久久婷婷色综合一区二区| 99精品久久久久久久婷婷| 国产91色综合久久免费| 99久久免费国产特黄| 色综合久久最新中文字幕| 国产精品久久网| 91精品国产高清久久久久久91|