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

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

PKU 3225 Help with Intervals

題目鏈接:http://poj.org/problem?id=3225
/*
題意:
    剛開始是一個[0, 65535]的集合,要求通過一些集合操作,最后輸出最小的
的集合。如果有多個,按結(jié)束坐標最小的依次輸出,集合操作包括:
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為空。

解法:
線段樹

思路:
    以上的五種操作,其實都可以轉(zhuǎn)化成線段樹的區(qū)間并操作,首先我們建立一
顆線段樹,對應以上的區(qū)間,我們注意到這里的區(qū)間有開有閉,為了方便處理,
可以將每個區(qū)間值乘上2,比如當前讀入的區(qū)間時(a,b],那么實際處理的其實是
[2*a+1, 2*b]這個區(qū)間,這樣做的好處是無論開閉都能映射到整點。然后再來看
集合操作如何轉(zhuǎn)化成線段樹的區(qū)間操作,首先要知道這些集合如何和線段樹的區(qū)
間一一對應,我的做法是在線段樹的區(qū)間上用01來表示當前集合的元素是否存在
。具體的對應如下:
    集合的并:S 并 T,要求S中的元素仍就存在,并且引入S中沒有的而且在T中
的元素,我們只要在T區(qū)間插入一段連續(xù)的1即可。
    集合的交:S 交 T,要求在S中不在T中的元素全部剔除,那么其實就是在T的
補區(qū)間內(nèi)插入一段連續(xù)的0即可。
    集合的差:S - T,這個形式其實可以表示成 S 交 非T,于是可以轉(zhuǎn)換成第二
種形式,就是在非T的補區(qū)間也就是T中插入一段連續(xù)的0。
    集合的逆差:T - S,這個形式可以表示成 非S 交 T,那么可以先將S中的元
素進行異或,然后再在T的補區(qū)間內(nèi)插入一段連續(xù)的0。
    集合的對稱集:S 異或 T,如果S和T中都存在那么就將他們?nèi)サ簦駝t只要
有一個存在就留下來。只要在T區(qū)間內(nèi)做一次異或操作即可。
    這樣一來完全對應了線段樹的操作,歸根到底只有三種插入操作:插入一段連
續(xù)的0,插入一段連續(xù)的1,將某段區(qū)間的值均和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>
            噜噜噜噜噜久久久久久91| 美女黄色成人网| 久久精品视频一| 在线视频亚洲欧美| 欧美风情在线观看| 亚洲大胆av| 噜噜噜在线观看免费视频日韩 | 久久精品网址| 欧美日韩在线看| 在线一区二区三区四区| 亚洲精品久久| 免费亚洲电影在线| 亚洲精品久久久久| 亚洲福利视频一区二区| 猫咪成人在线观看| 亚洲激情一区二区| 亚洲国产mv| 欧美日韩成人一区| 亚洲网站啪啪| 亚洲免费影视第一页| 国产日韩一区欧美| 久久久久久久综合日本| 久久精品国产亚洲精品| 亚洲国产精彩中文乱码av在线播放| 久久综合久久久| 男女激情久久| 一本色道久久综合亚洲二区三区 | 欧美精品一区二区三区蜜桃 | 久久精品国产综合| 久久丁香综合五月国产三级网站| 国产一区二区三区免费不卡 | 久久精品亚洲一区二区三区浴池| 欧美一级成年大片在线观看| 激情校园亚洲| 亚洲精品社区| 国产欧美丝祙| 欧美激情一区二区| 国产精品草莓在线免费观看| 久久国产精品久久国产精品 | 亚洲国产精品国自产拍av秋霞| 亚洲第一二三四五区| 欧美日韩高清不卡| 久久久久久久精| 欧美激情一区二区三区蜜桃视频 | 欧美亚洲综合久久| 久久久久久香蕉网| 在线视频欧美精品| 亚洲欧美日韩综合一区| 亚洲电影一级黄| 9l视频自拍蝌蚪9l视频成人| 国产欧美在线观看| 91久久午夜| 国产在线精品一区二区夜色| 老妇喷水一区二区三区| 欧美日韩1区| 久久精品国产69国产精品亚洲| 欧美高清在线| 久久只精品国产| 国产精品久久国产三级国电话系列 | 久久久久久夜| 午夜精品久久久久久久久| 老鸭窝亚洲一区二区三区| 亚洲欧美成人网| 久久人人97超碰精品888| 亚洲在线观看免费视频| 猛干欧美女孩| 久久久久9999亚洲精品| 欧美揉bbbbb揉bbbbb| 欧美激情在线免费观看| 激情久久综合| 性视频1819p久久| 亚洲女同在线| 欧美色综合天天久久综合精品| 欧美成人午夜视频| 好吊妞这里只有精品| 亚洲欧美成aⅴ人在线观看| 亚洲视频第一页| 欧美另类视频在线| 亚洲高清久久网| 91久久一区二区| 欧美刺激午夜性久久久久久久| 模特精品在线| 亚洲高清色综合| 乱码第一页成人| 亚洲成人在线网站| 亚洲欧洲三级| 欧美欧美在线| 日韩一级欧洲| 亚洲欧美视频一区二区三区| 国产精品国产精品| 亚洲女同性videos| 欧美一区二区成人6969| 国产精品九九| 午夜精品福利视频| 久久午夜视频| 亚洲国产午夜| 欧美韩日亚洲| 99精品久久久| 午夜影院日韩| 好吊一区二区三区| 免费在线观看成人av| 亚洲国产欧美日韩精品| 日韩视频精品在线观看| 欧美久久一区| 亚洲香蕉在线观看| 欧美在线观看视频一区二区| 一区二区三区不卡视频在线观看| 国产精品mv在线观看| 国产日韩精品一区观看| 亚洲毛片一区| 欧美福利视频网站| 久久福利一区| 一色屋精品亚洲香蕉网站| 久久男人av资源网站| 久久久久久久精| 国内精品久久久久久影视8| 午夜精品福利电影| 午夜一区二区三区在线观看| 亚洲经典一区| 久久久久久久一区二区| 国产日韩欧美亚洲| 久久婷婷av| 欧美国产亚洲另类动漫| 夜夜爽av福利精品导航| 亚洲电影视频在线| 免费91麻豆精品国产自产在线观看| 尤物九九久久国产精品的分类| 国产嫩草影院久久久久| 亚洲激情综合| 99热免费精品| 极品av少妇一区二区| 亚洲欧洲精品天堂一级| 国产精品久久久久久av下载红粉| 久久久999精品视频| 嫩草成人www欧美| 一区二区精品| 欧美在线首页| 欧美另类在线播放| 狠狠色狠狠色综合日日小说| 欧美大片第1页| 国精产品99永久一区一区| 亚洲国产成人午夜在线一区| 久久综合九色综合欧美狠狠| 国产精品99免费看 | 麻豆精品网站| 国产亚洲aⅴaaaaaa毛片| 免费不卡在线观看| 国产精品欧美风情| 一区二区高清在线观看| 日韩小视频在线观看| 美女露胸一区二区三区| 亚洲尤物在线| 欧美新色视频| 葵司免费一区二区三区四区五区| 免费h精品视频在线播放| 国产精品一区视频网站| 亚洲精品在线电影| 一区二区国产在线观看| 欧美久久久久免费| 日韩手机在线导航| 亚洲视屏在线播放| 欧美日韩性生活视频| 亚洲激情成人网| 亚洲国产精品高清久久久| 午夜精品免费| 亚洲第一页在线| 欧美区一区二| 欧美一区二区三区在线| 亚洲国产精品一区| 亚洲性xxxx| 永久免费精品影视网站| 久久久久欧美| 亚洲国产色一区| 欧美一区二区视频97| 国产精品成人观看视频免费 | 午夜精品久久久久久99热软件| 欧美激情 亚洲a∨综合| 亚洲视频欧美视频| 免费成人在线视频网站| 夜夜嗨av色综合久久久综合网| 欧美激情视频一区二区三区在线播放 | av不卡在线观看| 欧美电影免费网站| 午夜精品福利一区二区蜜股av| 国产永久精品大片wwwapp| 久久精品99久久香蕉国产色戒| 久久久中精品2020中文| 99国产精品| 亚洲一区二区精品在线| 1000部精品久久久久久久久| 欧美日韩国产黄| 鲁大师成人一区二区三区| 欧美亚洲视频在线观看| 亚洲精品黄网在线观看| 欧美粗暴jizz性欧美20| 亚洲高清123| 最新国产成人av网站网址麻豆| 欧美一区永久视频免费观看| 亚洲欧洲一区二区三区久久| 国产午夜一区二区三区|