• <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>
            隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
            數據加載中……

            ZJU 2301 Color the Ball

            題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2301
            /*
            題意:
                給出N(N <= 2000)組操作,每組操作的形式如下:
            A B C: 將[A,B]區間內的顏色染成C,C可以是白色或者黑色,序列開始
            是全黑色的,并且范圍在int范圍內,問染色完畢后最長的白色序列。


            解法:
            線段樹+離散化

            思路:
                線段樹染色問題,我的做法比較麻煩,如果直接用離散化會簡單許多
            ,但是這題是練習線段樹的好題,它同樣涉及到了lazy思想。因為要求得
            區間內最長的白色序列,線段樹的字段里面必須保存和這個長度有關的信
            息,我的域如下:
                int Color;         // 當前區間的顏色
                int lMax;          // 包含左區間的連續白色的最大值時的最右端點
                int rMax;          // 包含右區間的連續白色的最大值時的最左端點
                int MaxLR[2];      // 當前結點管轄區間的最優值的區間
                int l, r;          // 當前結點管理的左右區間

            我們用以下函數從左右兒子中得到當前結點的信息:
            void UpdateBy(Tree* ls, Tree* rs);
            之所以把它寫成函數是因為這里的處理比較麻煩,很容易出錯,并且需要
            調用多次,這個函數的作用就是通過左右兒子的信息填充本身的信息。
            信息一多,處理的時候就要極為小心,因為很容易出錯,Color字段其實是
            充當了lazy標記的作用,用于染色的時候將它專遞到子樹。
            [l, lMax]組成了當前結點的包含左閉區間的最優解。
            [rMax, r]組成了當前結點的包含右閉區間的最優解。
            [MaxLR[0], MaxLR[1]] 則是當前區間的最優解。
            這樣我們就可以通過傳遞性在兒子結點的屬性都得知的情況下將父親的值
            計算出來,最后遞歸到根結點。具體的計算過程可以自己畫棵樹看一下,
            在計算MaxLR的時候稍微麻煩一點。
            */


            #include 
            <iostream>
            #include 
            <cstring>
            #include 
            <algorithm>
            #include 
            <cstdio>
            #include 
            <vector>
            using namespace std;

            #define MUTIPLE_COLOR -1
            #define BLACK 0
            #define WHITE 1
            #define maxn 8200
            #define ul unsigned int

            struct point {
                
            int l, r;
                
            char color;
                point() 
            {}
                point(
            int _l, int _r, char _c) {
                    l 
            = _l;
                    r 
            = _r;
                    color 
            = _c;
                }

            }
            ;
            vector 
            <point> pt;
            int n;

            ul tmp[maxn], tmpsize;
            ul bin[maxn], size;

            void Process() {
                sort(tmp, tmp 
            + tmpsize);
                bin[ size 
            = 1 ] = tmp[0];
                
            for(int i = 1; i < tmpsize; i++{
                    
            if(tmp[i] != tmp[i-1])
                        bin[ 
            ++size ] = tmp[i];
                }

            }


            int Binary(int v) {
                
            int l = 1;
                
            int r = size;
                
            while(l <= r) {
                    
            int m = (l + r) >> 1;
                    
            if(bin[m] == v)
                        
            return m;
                    
            if(v > bin[m])
                        l 
            = m + 1;
                    
            else
                        r 
            = m - 1;
                }

            }


            struct Tree {
                
            int Color;         // 當前區間的顏色
                int lMax;          // 包含左區間的連續白色的最大值時的最右端點
                int rMax;          // 包含右區間的連續白色的最大值時的最左端點
                int MaxLR[2];      // 當前結點管轄區間的最優值的區間
                int l, r;
                
            int son[2];
                
            char lVal, rVal;

                
            void clear() {
                    son[
            0= son[1= -1;
                    AssignColor(BLACK);
                }

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

                
            void AssignColor(int nColor);
                
            void TranslateToSon();
                
            void WhiteProcess();
                
            void BlackProcess();

                
            void UpdateBy(Tree* ls, Tree* rs);
                
            void MaxVal(int xl, int xr);
            }
            T[maxn*3];
            int root, tot;

            int MMax(int a, int b) {
                
            return a > b ? a : b;
            }


            int GetID(int& root, int l, int r) {
                
            if(root == -1{
                    root 
            = tot++;
                    T[root].l 
            = l;
                    T[root].r 
            = r;
                    T[root].clear();
                }

                
            return root;
            }

            void Tree::WhiteProcess() {
                lMax 
            = r;
                rMax 
            = l;
                MaxLR[
            0= l; 
                MaxLR[
            1= r;
            }


            void Tree::BlackProcess() {
                lMax 
            = l - 1;
                rMax 
            = r + 1;
                MaxLR[
            0= -1;
                MaxLR[
            1= -1;
            }


            void Tree::AssignColor(int nColor) {
                Color 
            = nColor;
                
            if(nColor == MUTIPLE_COLOR)
                    
            return ;

                
            if(Color == WHITE) {
                    WhiteProcess();
                }
            else if(Color == BLACK){
                    BlackProcess();
                }

                lVal 
            = rVal = Color;
            }


            void Tree::TranslateToSon() {
                
            if(Color != MUTIPLE_COLOR) {
                    
            int mid = (l + r) >> 1;
                    
            int i0 = GetID(son[0], l, mid);
                    T[i0].AssignColor(Color);

                    
            int i1 = GetID(son[1], mid+1, r);
                    T[i1].AssignColor(Color);

                    Color 
            = MUTIPLE_COLOR;
                }

            }


            void Tree::MaxVal(int xl, int xr) {
                
            if(xl != -1 && xl <= xr) {
                    
            bool con = (MaxLR[0== -1)
                        
            || (bin[xr] - bin[xl] > bin[ MaxLR[1] ] - bin[ MaxLR[0] ])
                        
            || (bin[xr] - bin[xl] == bin[ MaxLR[1] ] - bin[ MaxLR[0] ] && bin[xl] < bin[MaxLR[0]]);

                    
            if(con) {
                        MaxLR[
            0= xl;
                        MaxLR[
            1= xr;
                    }

                }

            }


            void Tree::UpdateBy(Tree* ls, Tree* rs) {

                lVal 
            = ls->lVal;
                rVal 
            = rs->rVal;
                lMax 
            = (ls->lMax==ls->r) ? rs->lMax : ls->lMax;
                rMax 
            = (rs->rMax==rs->l) ? ls->rMax : rs->rMax;

                
            if(ls->Color == rs->Color) {
                    Color 
            = ls->Color;
                }
            else
                    Color 
            = MUTIPLE_COLOR;

                MaxLR[
            0= MaxLR[1= -1;
                MaxVal(l, lMax);
                MaxVal(rMax, r);

                MaxVal(ls
            ->rMax, rs->lMax);
                
                MaxVal(ls
            ->MaxLR[0], ls->MaxLR[1]);
                MaxVal(rs
            ->MaxLR[0], rs->MaxLR[1]);
            }


            void Insert(int& root, int nl, int nr, int l, int r, int val) {
                
            if(nl > r || nr < l)
                    
            return ;
                GetID(root, l, r);

                
            if(T[root].Color == val)
                    
            return ;

                
            if(nl <= l && r <= nr) {
                    T[root].AssignColor(val);
                    
            return ;
                }

                T[root].TranslateToSon();

                
            int mid = (l + r) >> 1;
                Insert(T[root].son[
            0], nl, nr, l, mid, val);
                Insert(T[root].son[
            1], nl, nr, mid + 1, r, val);

                T[root].UpdateBy(
            &T[ T[root].son[0] ], &T[ T[root].son[1] ]);
            }


            int main() {
                
            int i;
                
            int a, b;
                
            char str[10];
                
            while(scanf("%d"&n) != EOF) {
                    tmpsize 
            = 0;
                    pt.clear();
                    
            for(i = 0; i < n; i++{
                        scanf(
            "%d %d %s"&a, &b, str);
                        tmp[ tmpsize
            ++ ] = a - 1;
                        tmp[ tmpsize
            ++ ] = a;
                        tmp[ tmpsize
            ++ ] = b;
                        tmp[ tmpsize
            ++ ] = (ul)b + 1;
                        pt.push_back(point(a, b, str[
            0]=='w' ? WHITE : BLACK));
                    }

                    Process();
                    root 
            = -1;
                    tot 
            = 0;

                    Insert(root, 
            1, size, 1, size, BLACK);
                    
            for(i = 0; i < n; i++{
                        
            int l = Binary(pt[i].l);
                        
            int r = Binary(pt[i].r);
                        Insert(root, l, r, 
            1, size, pt[i].color);
                    }

                    
            if(T[root].MaxLR[0== -1)
                        printf(
            "Oh, my god\n");
                    
            else {
                        printf(
            "%d %d\n", bin[ T[root].MaxLR[0] ], bin[ T[root].MaxLR[1] ]);
                    }

                }

                
            return 0;
            }


            /*
            3
            1 100000 w
            2 6 b
            100 1000 b
            */

            posted on 2011-04-01 19:16 英雄哪里出來 閱讀(1606) 評論(0)  編輯 收藏 引用 所屬分類: 線段樹

            亚洲国产精品无码久久青草| 午夜精品久久久久久久久| 亚洲AV无码一区东京热久久| 久久久久亚洲av成人网人人软件 | 久久精品国产99久久丝袜| 久久99精品久久久久子伦| 天天爽天天狠久久久综合麻豆| 久久久久亚洲精品日久生情 | 久久亚洲精品中文字幕三区| 国产一久久香蕉国产线看观看| 欧美va久久久噜噜噜久久| 久久久国产乱子伦精品作者| 97久久精品无码一区二区| 97久久综合精品久久久综合| 99久久精品无码一区二区毛片 | 久久高潮一级毛片免费| 久久天天躁狠狠躁夜夜2020老熟妇| 久久久久九国产精品| 中文精品99久久国产 | 国产成人精品白浆久久69| 国产精品一久久香蕉国产线看 | 精品久久久久中文字| 日韩欧美亚洲国产精品字幕久久久 | 色综合久久久久综合体桃花网| 国产午夜免费高清久久影院| 国产精品成人久久久久三级午夜电影 | 伊人久久大香线蕉成人| 亚洲va久久久噜噜噜久久天堂| 久久精品成人免费网站| 思思久久精品在热线热| 99麻豆久久久国产精品免费| 久久亚洲国产成人影院网站| 伊人久久综合无码成人网| 99久久综合国产精品二区| 国产精品久久婷婷六月丁香| 91精品国产91久久久久久青草| 久久久噜噜噜久久中文字幕色伊伊| 色综合久久精品中文字幕首页| 亚洲?V乱码久久精品蜜桃| 国产美女久久久| 精品蜜臀久久久久99网站|