• <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
            數(shù)據(jù)加載中……

            ZJU 2706 Thermal Death of the Universe

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


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

            解法:
            線段樹

            思路:
                一看到數(shù)據(jù)量就可以首先確定是線段樹了,然后我們來把這題需要求的東西分解
            一下,題目中提到當前數(shù)列和和原數(shù)列和比較大小,所以首先一個操作就是區(qū)間求和
            ,然后將區(qū)間內的數(shù)替換成另外一個數(shù),這就用到了區(qū)間修改,和線段樹的操作完全
            吻合。接下來就可以開始設計線段樹結點的域了。其實這題的思想和pku 3468是大同
            小異的,還是lazy思想。每次插入的時候不更新到葉子結點,在插入?yún)^(qū)間完全覆蓋當
            前區(qū)間時就返回,否則將當前結點的lazy標記傳遞給左右兒子,并且更新左右兒子的
            sum值,注意,這里每次不是累加,因為是修改,所以直接將 sum*左右兒子的區(qū)間長
            度 分別賦值給左右兒子即可。遞歸結束時更新當前結點的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 英雄哪里出來 閱讀(1228) 評論(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 | 英雄哪里出來
            女人高潮久久久叫人喷水| 久久精品aⅴ无码中文字字幕重口| 国产精品视频久久久| 欧美精品一区二区精品久久| 国产成人久久激情91| 久久av高潮av无码av喷吹| 亚洲欧洲精品成人久久奇米网| 无码久久精品国产亚洲Av影片| 久久久久99精品成人片欧美| 国内精品久久久久久不卡影院| 亚洲精品无码专区久久同性男| 无码专区久久综合久中文字幕| 热久久这里只有精品| 久久精品国产色蜜蜜麻豆| 国产精品久久久久9999高清| 思思久久99热免费精品6| 国产精品对白刺激久久久| 久久久久久久综合狠狠综合| 99久久精品午夜一区二区 | 久久久久亚洲精品中文字幕| 亚洲va久久久噜噜噜久久天堂| 91精品无码久久久久久五月天| 亚洲精品无码久久久久久| 国产精品欧美久久久久无广告| 日产精品久久久一区二区| 性做久久久久久免费观看| 久久综合久久综合九色| 亚洲国产精品18久久久久久| 性做久久久久久久久浪潮| 久久99精品久久久久久9蜜桃 | 久久久无码精品亚洲日韩软件| 国产精品久久影院| 日韩久久久久久中文人妻| 久久久久亚洲AV无码观看 | 久久久久亚洲av综合波多野结衣| 国产精品久久久99| 国产精品美女久久久免费| 久久精品无码专区免费东京热| 久久久久se色偷偷亚洲精品av| 亚洲国产香蕉人人爽成AV片久久| 久久精品人妻一区二区三区|