青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數據加載中……

PKU 3225 Help with Intervals

題目鏈接:http://poj.org/problem?id=3225
/*
題意:
    剛開始是一個[0, 65535]的集合,要求通過一些集合操作,最后輸出最小的
的集合。如果有多個,按結束坐標最小的依次輸出,集合操作包括:
U T:S = S 并 T
I T:S = S 交 T
D T:S = S - T
C T:S = T - S
S T:S = (S - T) 并 (T - S) (集合的異或)
T為以下(a,b), (a,b], [a,b), [a,b]四種形式之一,初始集合S為空。

解法:
線段樹

思路:
    以上的五種操作,其實都可以轉化成線段樹的區間并操作,首先我們建立一
顆線段樹,對應以上的區間,我們注意到這里的區間有開有閉,為了方便處理,
可以將每個區間值乘上2,比如當前讀入的區間時(a,b],那么實際處理的其實是
[2*a+1, 2*b]這個區間,這樣做的好處是無論開閉都能映射到整點。然后再來看
集合操作如何轉化成線段樹的區間操作,首先要知道這些集合如何和線段樹的區
間一一對應,我的做法是在線段樹的區間上用01來表示當前集合的元素是否存在
。具體的對應如下:
    集合的并:S 并 T,要求S中的元素仍就存在,并且引入S中沒有的而且在T中
的元素,我們只要在T區間插入一段連續的1即可。
    集合的交:S 交 T,要求在S中不在T中的元素全部剔除,那么其實就是在T的
補區間內插入一段連續的0即可。
    集合的差:S - T,這個形式其實可以表示成 S 交 非T,于是可以轉換成第二
種形式,就是在非T的補區間也就是T中插入一段連續的0。
    集合的逆差:T - S,這個形式可以表示成 非S 交 T,那么可以先將S中的元
素進行異或,然后再在T的補區間內插入一段連續的0。
    集合的對稱集:S 異或 T,如果S和T中都存在那么就將他們去掉,否則只要
有一個存在就留下來。只要在T區間內做一次異或操作即可。
    這樣一來完全對應了線段樹的操作,歸根到底只有三種插入操作:插入一段連
續的0,插入一段連續的1,將某段區間的值均和1異或。而查詢操作是最后的依次
詢問。而這三種操作可以參見下面這題的題解:
http://www.shnenglu.com/menjitianya/archive/2011/04/02/143265.html
*/


#include 
<iostream>

using namespace std;

#define maxn 65535*2


enum Lazy_Tag {
    ZERO    
= 0,
    ONE     
= 1,
    XOR     
= 2,
    TAG_MAX 
= 3,
}
;

struct Interval {
    
char operands;
    
int left, right;
    Interval() 
{}
    Interval(
char op, int l, int r) {
        operands 
= op;
        left 
= l;
        right 
= r;
    }

}
I[maxn*5];

char id[] = {'U''I''D''C''S'};

int find(char c) {
    
for(int i = 0; i < 5; i++{
        
if(c == id[i])
            
return i;
    }

}


struct Tree {
    
char lazy[TAG_MAX];
    
int Sum;
    
int root, l, r;

    
void CoverBy(int mode);
    
void UpdateBy(Tree* ls, Tree* rs);
    
void TranslateToSon();
    
void TranslateTo(Tree* ts);

    
int len() {
        
return r - l + 1;
    }

}
T[maxn*4];
int v[maxn+1];


void Build(int root, int l, int r) {
    T[root].l 
= l;
    T[root].r 
= r;
    T[root].root 
= root;
    T[root].Sum 
= 0;
    
int i;
    
for(i = 0; i < TAG_MAX; i++)
        T[root].lazy[i] 
= 0;

    
if(l == r)
        
return ;

    
int mid = (l + r) >> 1;
    Build(root
<<1, l, mid);
    Build(root
<<1|1, mid+1, r);
}


void Tree::UpdateBy(Tree* ls, Tree* rs) {
    Sum 
= ls->Sum + rs->Sum;
}


void Tree::CoverBy(int mode) {
    
if(mode == ZERO || mode == ONE) {
        Sum 
= len() * mode;
        lazy[mode] 
= 1;
        lazy[mode
^1= lazy[XOR] = 0;
    }
else {
        Sum 
= len() - Sum;
        
if(lazy[ONE]) {
            lazy[ONE] 
= 0;
            lazy[ZERO] 
= 1;
        }
else if(lazy[ZERO]) {
            lazy[ZERO] 
= 0;
            lazy[ONE] 
= 1;
        }
else
            lazy[XOR] 
^= 1;
    }

}


void Tree::TranslateToSon() {
    TranslateTo(
&T[root<<1]);
    TranslateTo(
&T[root<<1|1]);
    
for(int i = 0; i < TAG_MAX; i++)
        lazy[i] 
= 0;
}


void Tree::TranslateTo(Tree* ts){
    
for(int i = 0; i < TAG_MAX; i++{
        
if(lazy[i]) {
            ts
->CoverBy(i);
        }

    }

}



void Insert(int root, int l, int r, int mode) {
    
if(l > T[root].r || r < T[root].l)
        
return ;

    
if(mode != XOR && T[root].lazy[mode]) {
        
return ;
    }


    
if(l <= T[root].l && T[root].r <= r) {
        T[root].CoverBy(mode);
        
return ;
    }

    T[root].TranslateToSon();
    Insert(root
<<1, l, r, mode);
    Insert(root
<<1|1, l, r, mode);

    T[root].UpdateBy(
&T[root<<1], &T[root<<1|1]);
}


int Query(int root, int pos) {
    
if(pos > T[root].r || pos < T[root].l)
        
return 0;
    
if(pos <= T[root].l && T[root].r <= pos) {
        
return T[root].Sum;
    }

    T[root].TranslateToSon();
    
return Query(root<<1, pos) + Query(root<<1|1, pos);
}


int main() {
    
char str[2][100];
    
int size = 0;
    
int i, j;

    
while(scanf("%s %s", str[0], str[1]) != EOF) {
        
int len = strlen(str[1]);
        
int a[2= {00}, top = 0;
        
for(i = 1; str[1][i]; i++{
            
if(str[1][i] >= '0' && str[1][i] <= '9'{
                a[top] 
= a[top] * 10 + (str[1][i] - '0');
            }
else if(str[1][i] == ','{
                top
++;
            }

        }

        a[
0*= 2; a[1*= 2;
        
if(str[1][0== '(') a[0++;
        
if(str[1][len-1== ')') a[1]--;

        I[size
++= Interval(find(str[0][0]), a[0], a[1]);
    }

    Build(
10, maxn);

    
for(i = 0; i < size; i++{
        
if(I[i].operands == 0{
            
// 集合并
            Insert(1, I[i].left, I[i].right, 1);
        }
else if(I[i].operands == 1{
            
// 集合交
            Insert(10, I[i].left - 10);
            Insert(
1, I[i].right+1, maxn, 0);
        }
else if(I[i].operands == 2{
            
// 集合差
            Insert(1, I[i].left, I[i].right, 0);
        }
else if(I[i].operands == 3{
            
// 集合逆差
            Insert(10, I[i].left - 10);
            Insert(
1, I[i].right+1, maxn, 0);
            Insert(
1, I[i].left, I[i].right, 2);
        }
else if(I[i].operands == 4{
            
// 集合的對稱集
            Insert(1, I[i].left, I[i].right, 2);
        }

    }

    
int Min = INT_MAX;
    size 
= 0;

    
for(i = 0; i <= maxn; i++{
        v[i] 
= Query(1, i);
    }


    
for(i = 0; i <= maxn; i++{
        
if(v[i]) {
            
for(j = i + 1; j <= maxn; j++{
                
if(!v[j])
                    
break;
            }

            I[size
++= Interval(0, i, j-1);
            i 
= j;
        }

    }


    
if(size == 0{
        printf(
"empty set\n");
    }
else {
        
for(i = 0; i < size; i++{
            
if(i)
                printf(
" ");
            printf(
"%c%d,%d%c", I[i].left&1?'(':'[', I[i].left/2, (I[i].right+1)/2, I[i].right&1?')':']');
        }

        puts(
"");
    }

    
return 0;
}


/*
U (1,65535)
D (100,1000]

U (0,65535)
D (10,65535)
D [10,10]
U (65525,65535]
U [0,0]
*/

posted on 2011-04-02 22:50 英雄哪里出來 閱讀(1540) 評論(2)  編輯 收藏 引用 所屬分類: 線段樹

評論

# re: PKU 3225 Help with Intervals  回復  更多評論   

看你的解題報告就是容易明白,感謝啊!!
2011-09-07 10:24 | 卡卡
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产一区二区三区a毛片| 欧美中文在线观看| 久久夜色精品亚洲噜噜国产mv| 国产精品99久久久久久白浆小说| 欧美freesex8一10精品| 亚洲欧洲另类国产综合| 亚洲第一级黄色片| 欧美日韩爆操| 午夜日本精品| 欧美一站二站| 亚洲第一区中文99精品| 亚洲国产精品成人va在线观看| 欧美aⅴ99久久黑人专区| 99精品国产在热久久| 日韩一区二区福利| 国产日韩欧美不卡| 欧美成人午夜激情视频| 欧美日韩一区二区三区在线看| 亚洲永久免费精品| 久久久av毛片精品| 99视频精品全部免费在线| 中文高清一区| 亚洲福利国产精品| 在线视频日韩精品| 狠狠色丁香久久婷婷综合_中| 欧美激情精品久久久久久黑人| 欧美啪啪成人vr| 久久久综合精品| 欧美日本韩国一区二区三区| 久久九九热免费视频| 欧美国产1区2区| 久久精品国产亚洲精品| 欧美精品免费在线| 久久久久久欧美| 欧美视频免费| 麻豆国产精品va在线观看不卡| 欧美日韩高清在线| 裸体歌舞表演一区二区 | 午夜亚洲伦理| 免费看成人av| 久久久www成人免费无遮挡大片| 欧美精品日韩三级| 老鸭窝91久久精品色噜噜导演| 欧美日韩在线播放一区| 欧美高清视频在线观看| 国产一区二区在线观看免费播放| 一区二区欧美视频| 亚洲精品影院| 久久综合九色综合久99| 欧美一区二区三区视频免费| 欧美日韩mv| 欧美黄免费看| 在线观看欧美黄色| 欧美专区在线观看一区| 亚洲欧美日韩国产综合在线| 欧美绝品在线观看成人午夜影视| 免费不卡在线观看| 国内综合精品午夜久久资源| 亚洲一区久久| 亚洲欧美日韩精品久久奇米色影视| 欧美国内亚洲| 欧美激情综合色| 亚洲欧洲一区二区在线播放| 久久午夜羞羞影院免费观看| 久久婷婷成人综合色| 国产自产精品| 久久精品视频播放| 久久综合久久综合久久| 黄色小说综合网站| 久久人人爽人人| 六十路精品视频| 亚洲国产精品久久久久秋霞蜜臀| 久久天天狠狠| 亚洲国产福利在线| 日韩午夜在线观看视频| 欧美精品www| 9久re热视频在线精品| 亚洲一级一区| 国产麻豆91精品| 久久精品女人| 欧美高清影院| 在线视频欧美日韩精品| 国产精品久久久久av| 亚洲一区二区免费在线| 久久精品av麻豆的观看方式 | 久久久精品国产99久久精品芒果| 久久免费国产| 亚洲精品综合久久中文字幕| 欧美日韩国产123| 亚洲男人的天堂在线| 久久男女视频| 亚洲精品综合久久中文字幕| 国产精品国产三级国产aⅴ浪潮| 亚洲欧美激情一区二区| 久热精品视频在线观看| 亚洲精品在线免费观看视频| 国产精品ⅴa在线观看h| 久久aⅴ国产欧美74aaa| 亚洲高清自拍| 亚洲欧美变态国产另类| 激情久久综合| 欧美日韩一区二区在线播放| 欧美专区在线播放| 日韩视频永久免费| 久久亚洲国产精品一区二区| 99精品国产高清一区二区| 国产欧美日韩激情| 欧美韩日一区二区| 欧美一区二区黄色| 日韩视频免费观看高清完整版| 欧美在线91| 宅男精品导航| 亚洲电影免费观看高清完整版| 国产精品va| 欧美国产另类| 久久久欧美精品sm网站| 亚洲深夜影院| 亚洲国产精品www| 久久久久久久久久久一区| 99re视频这里只有精品| 激情六月综合| 国产美女在线精品免费观看| 欧美日韩国产精品专区 | 亚洲视频999| 亚洲激情在线观看| 欧美成人国产| 久久久久99| 香蕉久久一区二区不卡无毒影院| 亚洲久久一区| 亚洲高清av| 在线成人免费观看| 国产一区二区三区久久 | 国语自产精品视频在线看一大j8| 欧美日韩免费视频| 欧美精品v日韩精品v韩国精品v | 99综合在线| 亚洲黑丝在线| 亚洲国产日韩欧美在线图片| 每日更新成人在线视频| 久久久久久久一区二区| 午夜精品视频在线观看一区二区| 中文久久乱码一区二区| 99热精品在线| 中国女人久久久| 在线视频欧美日韩精品| 艳妇臀荡乳欲伦亚洲一区| 亚洲精品视频一区| 亚洲人成77777在线观看网| 在线精品视频在线观看高清| 黄色成人91| 亚洲电影中文字幕| 亚洲精品1234| 亚洲高清不卡av| 99re热这里只有精品免费视频| 日韩一区二区免费高清| 正在播放亚洲| 午夜精品久久久| 欧美在线免费观看| 免费看av成人| 亚洲国产成人精品久久| 亚洲免费av电影| 亚洲欧美另类久久久精品2019| 午夜精品国产更新| 久久精品视频免费播放| 欧美aaaaaaaa牛牛影院| 欧美日韩福利| 国产视频精品免费播放| 亚洲电影天堂av| 中日韩美女免费视频网址在线观看| 亚洲香蕉网站| 久久青草欧美一区二区三区| 欧美大片在线观看一区| 欧美韩日一区二区三区| 日韩午夜免费| 欧美在线观看视频| 老鸭窝毛片一区二区三区| 欧美日韩国产成人在线| 国产美女精品人人做人人爽| 在线不卡中文字幕| 亚洲淫性视频| 欧美成年视频| 亚洲一区综合| 欧美国产极速在线| 国产伦精品一区二区三区高清| 亚洲高清在线观看一区| 午夜精品久久久久久久久| 欧美va亚洲va国产综合| 亚洲小视频在线观看| 蜜桃精品久久久久久久免费影院| 欧美深夜影院| 亚洲精品国产欧美| 久久国产精品久久精品国产| 亚洲激情小视频| 久久激情视频| 国产精品乱码| 一级成人国产| 欧美激情精品久久久久久变态| 午夜精品久久久久久久蜜桃app| 欧美va天堂| 影音先锋久久|