• <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 2706 Thermal Death of the Universe

            題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2706


            /*
            題意:
                給定一個長度為N(N <= 30000)的數列Si,緊接著Q條區間處理,每一條處理的要
            求是將給定的區間內的數字替換成他們的平均值,替換時如果當前數列的總和比原先
            數列的總和小或者相等時,平均值向上取整,否則向下取整,最后要求輸出處理完的
            數組的每一個元素。

            解法:
            線段樹

            思路:
                一看到數據量就可以首先確定是線段樹了,然后我們來把這題需要求的東西分解
            一下,題目中提到當前數列和和原數列和比較大小,所以首先一個操作就是區間求和
            ,然后將區間內的數替換成另外一個數,這就用到了區間修改,和線段樹的操作完全
            吻合。接下來就可以開始設計線段樹結點的域了。其實這題的思想和pku 3468是大同
            小異的,還是lazy思想。每次插入的時候不更新到葉子結點,在插入區間完全覆蓋當
            前區間時就返回,否則將當前結點的lazy標記傳遞給左右兒子,并且更新左右兒子的
            sum值,注意,這里每次不是累加,因為是修改,所以直接將 sum*左右兒子的區間長
            度 分別賦值給左右兒子即可。遞歸結束時更新當前結點的sum值。詢問時也是相同,
            每次傳遞lazy標記給兒子。這樣就可以做到詢問和插入都是log(n)。
            */


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

            #define maxn 30010
            #define inf INT_MIN
            #define ll long long

            struct Tree {
                
            int p, l, r;
                ll sum;
                ll lazy_tag;

                
            void ClearTag();

                
            int GetMid() {
                    
            return (l + r) >> 1;
                }

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

            }
            T[4*maxn];

            void Tree::ClearTag() {
                
            if(lazy_tag) {
                    T[p
            <<1].lazy_tag    = lazy_tag;
                    T[p
            <<1|1].lazy_tag  = lazy_tag;
                    
                    T[p
            <<1].sum         = lazy_tag * T[p<<1].GetLen();
                    T[p
            <<1|1].sum       = lazy_tag * T[p<<1|1].GetLen();
                    
                    lazy_tag 
            = 0;
                }

            }


            int n, m;
            int val[maxn];

            void Build(int p, int l, int r) {
                T[p].l 
            = l;
                T[p].r 
            = r;
                T[p].p 
            = p;
                T[p].lazy_tag 
            = 0;

                
            if(l == r) {
                    T[p].sum 
            = val[l];
                    
            return ;
                }


                
            int mid = (l + r) >> 1;
                Build(p
            <<1, l, mid);
                Build(p
            <<1|1, mid+1, r);
                T[p].sum 
            = T[p<<1].sum + T[p<<1|1].sum;
            }


            ll Query(
            int p, int l, int r) {
                
            if(l <= T[p].l && T[p].r <= r) {
                    
            return T[p].sum;
                }

                T[p].ClearTag();
                
            int mid = T[p].GetMid();

                ll v 
            = 0;
                
            if(l <= mid) {
                    v 
            += Query(p<<1, l, r);
                }

                
            if(r >= mid + 1{
                    v 
            += Query(p<<1|1, l, r);
                }


                
            return v;
            }


            void Modify(int p, int l, int r, ll val) {
                
            if(l <= T[p].l && T[p].r <= r) {
                    T[p].lazy_tag 
            = val;
                    T[p].sum 
            = val * T[p].GetLen();
                    
            return ;
                }

                T[p].ClearTag();
                
                
            int mid = T[p].GetMid();
                
            if(l <= mid) {
                    Modify(p
            <<1, l, r, val);
                }

                
            if(r >= mid + 1{
                    Modify(p
            <<1|1, l, r, val);
                }


                T[p].sum 
            = T[p<<1].sum + T[p<<1|1].sum;
            }


            ll Calc(ll val, 
            int dn, bool bRoundUp) {
                
            if(val >= 0{
                    
            if(bRoundUp) {
                        
            return (val + dn - 1/ dn;
                    }
            else
                        
            return val / dn;
                }
            else {
                    val 
            = -val;
                    
            if(bRoundUp) {
                        
            return -(val / dn);
                    }
            else {
                        
            return -((val + dn - 1/ dn);
                    }

                }

            }


            int main() {
                
            int i;
                
            int x, y;
                
            while(scanf("%d %d"&n, &m) != EOF) {
                    
            for(i = 1; i <= n; i++{
                        scanf(
            "%d"&val[i]);
                    }

                    Build(
            11, n);
                    ll ans 
            = T[1].sum;
                    
            while(m--{
                        scanf(
            "%d %d"&x, &y);
                        ll Sum 
            = Query(1, x, y);
                        ll all 
            = Query(11, n);
                        Sum 
            = Calc(Sum, y-x+1, all <= ans);
                        Modify(
            1, x, y, Sum);
                    }

                    
            for(i = 1; i <= n; i++{
                        
            if(i != 1)
                            printf(
            " ");
                        printf(
            "%lld", Query(1, i, i));
                    }

                    puts(
            "\n");
                }

                
            return 0;
            }

            posted on 2011-03-30 11:58 英雄哪里出來 閱讀(1233) 評論(2)  編輯 收藏 引用 所屬分類: 線段樹

            評論

            # re: ZJU 2706 Thermal Death of the Universe  回復  更多評論   

            某ACM菜鳥,前來串門。。。
            2011-03-30 13:10 | coreBugZJ

            # re: ZJU 2706 Thermal Death of the Universe  回復  更多評論   

            @coreBugZJ
            同菜~~
            2011-03-30 13:31 | 英雄哪里出來
            久久亚洲AV成人无码国产| 久久久久久亚洲精品不卡 | AAA级久久久精品无码片| 久久人人爽爽爽人久久久| 99久久免费国产特黄| 久久国产午夜精品一区二区三区| 国产精品欧美亚洲韩国日本久久| 一本色道久久88综合日韩精品 | 久久国产一区二区| 久久综合伊人77777麻豆| 日韩精品久久无码人妻中文字幕 | 欧美久久一区二区三区| 久久久久青草线蕉综合超碰| 久久99国产精品一区二区| 国产精品久久久久国产A级| 久久亚洲AV永久无码精品| 麻豆成人久久精品二区三区免费| 国产福利电影一区二区三区久久久久成人精品综合 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 午夜精品久久久久成人| 99久久精品国产免看国产一区| 欧美午夜A∨大片久久| 久久久久久久综合日本亚洲 | 久久美女人爽女人爽| 久久亚洲精品成人无码网站| 久久午夜电影网| 久久婷婷五月综合97色| 精品久久久中文字幕人妻| 久久精品亚洲福利| 精品久久久久久无码国产| 国产69精品久久久久777| 亚洲级αV无码毛片久久精品| 久久夜色精品国产噜噜亚洲a| 国内精品久久久久久麻豆| 久久狠狠色狠狠色综合| 国产精品久久毛片完整版| 久久久久亚洲AV无码网站| 久久人人爽人人爽人人片AV不| 久久青青色综合| 亚洲国产精品成人AV无码久久综合影院 | 亚洲国产精品无码久久久不卡|