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

隨筆 - 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://m.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 英雄哪里出來 閱讀(1529) 評論(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ⅴ在线观看| 亚洲欧美清纯在线制服| 亚洲一区二区不卡免费| 亚洲综合精品四区| 欧美一区二区三区在线看| 欧美一区二区三区视频在线观看| 久久成人这里只有精品| 久久夜色精品国产| 亚洲福利国产| 亚洲精品看片| 亚洲欧美精品在线观看| 久久久国产精品一区| 美日韩精品视频| 欧美日韩日本视频| 久久丁香综合五月国产三级网站| 亚洲欧美另类久久久精品2019| 亚洲欧美国产精品专区久久| 久久不射网站| 欧美成人综合| 国产精品一区二区三区乱码| 亚洲高清av| 香蕉成人久久| 亚洲国产毛片完整版| 亚洲视频一二区| 欧美综合国产| 欧美视频官网| **性色生活片久久毛片| 中文高清一区| 嫩草影视亚洲| 亚洲天堂久久| 欧美极品一区| 尤物在线精品| 午夜精品一区二区在线观看| 男人天堂欧美日韩| 亚洲欧美成人| 欧美手机在线视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产手机视频一区二区| 亚洲精品在线观| 久久免费偷拍视频| 亚洲免费网站| 国产精品成人免费视频| 最新国产成人av网站网址麻豆| 久久aⅴ乱码一区二区三区| 欧美国产精品劲爆| 久久久久久久久久久久久久一区| 国产精品亚洲аv天堂网| 99在线视频精品| 亚洲高清色综合| 久久精品一区二区国产| 国产亚洲欧美激情| 午夜精品一区二区三区四区| 日韩一区二区精品| 欧美日韩日日骚| 亚洲一区二区三区中文字幕| 亚洲精品日韩激情在线电影 | 国产日韩欧美亚洲| 亚洲一区高清| 亚洲午夜精品久久久久久浪潮 | 亚洲大胆女人| 久久久亚洲人| 久久九九精品| 一区二区在线不卡| 亚洲第一精品夜夜躁人人爽| 你懂的国产精品| 99re6热在线精品视频播放速度| 免费观看在线综合| 麻豆成人精品| 日韩视频亚洲视频| 久久国产精品网站| 伊人成人在线视频| 欧美高清免费| 欧美金8天国| 一区二区三区四区五区在线| 99精品国产在热久久| 国产精品久久久久久久浪潮网站| 亚洲欧美日韩直播| 西西裸体人体做爰大胆久久久| 国产午夜精品久久久久久免费视| 久久三级视频| 欧美精品18| 羞羞视频在线观看欧美| 久久国内精品自在自线400部| 伊人婷婷欧美激情| 99re热精品| 国语自产在线不卡| 国产亚洲女人久久久久毛片| 亚洲乱码国产乱码精品精天堂| 亚洲区中文字幕| 国产精品成人在线| 麻豆精品在线视频| 欧美日韩久久久久久| 欧美一区三区二区在线观看| 久久久久久久久综合| 亚洲三级免费| 欧美一区二区三区在线视频 | 欧美国产激情| 亚洲网站在线| 久久一日本道色综合久久| 亚洲剧情一区二区| 亚洲免费网站| 夜夜嗨av一区二区三区四季av| 亚洲欧美第一页| 亚洲精品日韩久久| 欧美亚洲日本一区| 亚洲视频电影在线| 久久久噜噜噜久久中文字免| 亚洲在线视频一区| 欧美高清视频一区| 快射av在线播放一区| 国产精品久久久久久久一区探花| 欧美成人激情视频免费观看| 国产精品一区毛片| 亚洲视频在线观看网站| 亚洲精品久久久久久久久| 久久成人精品电影| 久久国产精品毛片| 国产精品美女午夜av| 亚洲美女av网站| 亚洲国产美女精品久久久久∴| 欧美一级播放| 午夜视频一区二区| 欧美网站在线| 亚洲美女区一区| 日韩视频在线永久播放| 快播亚洲色图| 欧美1级日本1级| 在线观看91精品国产麻豆| 欧美一级大片在线免费观看| 国产精品99久久久久久人| 欧美在线综合| 久久精品国产久精国产爱| 国产精品女人久久久久久| 亚洲黄色影院| 亚洲国产中文字幕在线观看| 久久久久一区二区三区| 久久午夜视频| 在线日韩中文| 蜜桃av综合| 亚洲人成网站在线观看播放| 日韩一区二区精品视频| 欧美日韩综合不卡| 一区二区欧美视频| 午夜一区在线| 国内外成人免费激情在线视频网站| 亚洲免费一区二区| 久久久久久久综合色一本| 狠久久av成人天堂| 嫩草成人www欧美| 洋洋av久久久久久久一区| 欧美亚洲自偷自偷| 精品动漫3d一区二区三区免费| 老司机精品导航| 亚洲美女视频网| 欧美一区精品| 亚洲激情欧美激情| 欧美日韩日本国产亚洲在线| 一区二区三区免费观看| 欧美一区二区三区在线免费观看| 国产一区二区三区四区在线观看 | 国产欧美三级| 久久成人综合网| 欧美国产日韩一区二区| 99亚洲一区二区| 国产日产精品一区二区三区四区的观看方式 | 性欧美超级视频| 精品999在线播放| 欧美久久久久久久久| 亚洲一区二区三区视频| 久久久久久久一区| 欧美在线三级| 亚洲第一页在线| 欧美午夜寂寞影院| 欧美影院精品一区| 亚洲高清自拍| 先锋影音国产一区| 亚洲精品久久视频| 国产日韩在线一区二区三区| 你懂的一区二区| 欧美一区二区三区日韩视频| 亚洲欧洲一级| 六月婷婷久久| 欧美一区三区三区高中清蜜桃 | 亚洲成人中文| 久久久国产精品亚洲一区| 一区二区三区在线视频免费观看| 欧美日韩国产成人在线观看| 欧美一区二区三区免费视| 亚洲日本aⅴ片在线观看香蕉| 欧美在线你懂的| 中文国产成人精品| 亚洲福利一区| 国产欧美一区二区三区在线老狼 | 宅男噜噜噜66一区二区 | 亚洲国产精品久久| 久热精品在线| 久久精品动漫| 先锋影音久久|