• <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 英雄哪里出來 閱讀(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爰片久久毛片| 欧美伊人久久大香线蕉综合| 精品伊人久久大线蕉色首页| 亚洲欧美日韩精品久久亚洲区| 伊人久久大香线蕉综合热线| AV无码久久久久不卡蜜桃| 久久A级毛片免费观看| 国产成人无码精品久久久久免费| 久久一区二区三区免费| 久久夜色精品国产网站| 国产精品99久久久久久董美香| 99久久精品免费看国产| 精品久久久久久国产| 亚洲综合婷婷久久| 亚洲香蕉网久久综合影视 | 麻豆久久久9性大片| 久久精品aⅴ无码中文字字幕重口| 国产精品久久久久久久 | 亚洲中文字幕久久精品无码APP| 久久被窝电影亚洲爽爽爽| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产福利电影一区二区三区久久久久成人精品综合 | 18岁日韩内射颜射午夜久久成人 | 国内精品伊人久久久久妇| 国产精品久久久久…| 2020国产成人久久精品| 国产精品免费久久| 国产精品一久久香蕉产线看| 久久只这里是精品66| 久久精品国产黑森林| 日韩一区二区久久久久久| 久久一日本道色综合久久| 久久久久青草线蕉综合超碰| 精品多毛少妇人妻AV免费久久| 久久久无码人妻精品无码| 中文字幕日本人妻久久久免费| 精品国产日韩久久亚洲| 久久AV高潮AV无码AV| 久久无码AV中文出轨人妻| 2021国产精品久久精品| 久久99久久99精品免视看动漫|