• <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)典題目
            国产午夜精品久久久久九九| 中文字幕久久精品无码| 国产精品内射久久久久欢欢| 国内精品久久久久久麻豆| 伊人色综合久久天天网| 久久人爽人人爽人人片AV| 国产亚洲精午夜久久久久久| 久久99久国产麻精品66| 国产福利电影一区二区三区久久久久成人精品综合 | 亚洲综合伊人久久综合| 久久线看观看精品香蕉国产| 久久精品国产99国产精品亚洲| 青青国产成人久久91网| 天天躁日日躁狠狠久久| 亚洲а∨天堂久久精品9966| 久久亚洲国产成人精品性色| 久久久久综合中文字幕| 亚洲国产成人久久综合碰碰动漫3d | 久久伊人精品青青草原高清| 久久久久人妻一区二区三区| 国产成人久久久精品二区三区| 久久中文骚妇内射| 久久精品aⅴ无码中文字字幕不卡| 久久亚洲中文字幕精品一区| 99麻豆久久久国产精品免费| 狠狠色狠狠色综合久久| 久久人与动人物a级毛片| 亚洲欧洲精品成人久久曰影片| 欧美日韩中文字幕久久久不卡 | 亚洲国产精品无码久久一区二区| 亚洲成av人片不卡无码久久| 久久人人爽人人精品视频| 久久九九久精品国产| 久久青青草原精品国产软件| 久久亚洲精品无码播放| 亚洲人AV永久一区二区三区久久| 天堂无码久久综合东京热| 无码任你躁久久久久久久| 色偷偷91久久综合噜噜噜噜| 精品国产乱码久久久久久呢| 久久婷婷五月综合色高清|