• <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
            數據加載中……

            PKU 3468 A Simple Problem with Integers

            題目鏈接:http://poj.org/problem?id=3468

            /*
            題意:
                給定一個長度為N(N <= 100000)的數列Si,緊接著Q條詢問,詢問格式如下:
            "C a b c" 表示對 Aa, Aa+1,  , Ab 的值都加上一個c(-10000 <= c <= 10000)
            "Q a b" 表示求 Aa, Aa+1,  , Ab 的和。

            解法:
            線段樹

            思路:
                線段樹的經典題目了,主要是一個lazy思想。這題要求求和,所以我們給線段樹
            的每個結點添加一個sum字段和一個lazy-tag標記(等下來討論這個標記的作用)。
                每次在區間[a, b]插入一個c的時候,如果更新到葉子節點,那么無疑是nlogn的,
            比純暴力還要不值,所以添加lazy標記是為了延遲更新,使得每次插入和詢問都控制
            在log(n)。在插入時,只在[a, b]完全覆蓋當前結點區間時,才把c的值累加給lazy-
            tag,sum的值也加上當前 當前結點區間長度*c。如果沒有完全覆蓋,則繼續遞歸左右
            兒子,并且如果當前結點存在lazy標記,那么將它的值累加到左右兒子的lazy標記上,
            并且讓左右兒子更新sum值,最后當前結點的lazy標記清零。注意遞歸完畢時需要更新
            當前結點的sum值,因為左右兒子的sum值的改變勢必會影響到當前結點。詢問時也一
            樣,每次將當前結點的lazy標記傳遞給兒子。當遞歸到區間完全覆蓋的時候返回,這樣
            詢問也是log(n)的。
            */

            #include 
            <iostream>

            using namespace std;

            #define ll __int64

            #define maxn 100200

            struct Tree {
                
            int idx;
                
            int l, r;
                ll sum;      
            // 當前區間的和
                ll lazyTag;  // lazy 標記

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


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


                
            void ClearTag() {
                    
            if(lazyTag) {
                        T[idx
            <<1].lazyTag   += lazyTag;
                        T[idx
            <<1|1].lazyTag += lazyTag;
                        
                        T[idx
            <<1].sum       += lazyTag * T[idx<<1].GetLen();
                        T[idx
            <<1|1].sum     += lazyTag * T[idx<<1|1].GetLen();
                        
                        lazyTag 
            = 0;
                    }

                }

            }
            T[4*maxn];

            int n, m;
            int v[maxn];

            void Build(int p, int l, int r) {
                T[p].l 
            = l; T[p].r = r;
                T[p].idx 
            = p; T[p].lazyTag = 0;
                
            if(l == r) {
                    T[p].sum 
            = v[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;
            }


            void Insert(int p, int l, int r, ll v) {
                
            if(l <= T[p].l && T[p].r <= r) {
                    T[p].lazyTag 
            += v;
                    T[p].sum 
            += v * T[p].GetLen();
                    
            return ;
                }

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

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

                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;
            }


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

                    Build(
            11, n);
                    
            while(m--{
                        scanf(
            "%s", str);
                        
            if(!strcmp(str, "Q")) {
                            scanf(
            "%d %d"&x, &y);
                            ll val 
            = Query(1, x, y);
                            printf(
            "%I64d\n", val);
                        }
            else {
                            scanf(
            "%d %d %d"&x, &y, &z);
                            Insert(
            1, x, y, z);
                        }

                    }

                }

                
            return 0;
            }

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

            国产精品青草久久久久福利99| 久久精品中文字幕一区| 欧美亚洲另类久久综合婷婷| 99久久人人爽亚洲精品美女| 99久久亚洲综合精品成人| 亚洲国产精品久久| 久久久久久毛片免费看| 亚洲精品97久久中文字幕无码| 一级做a爰片久久毛片免费陪| 久久国产欧美日韩精品免费| 亚洲中文字幕无码久久精品1| 亚洲色欲久久久综合网| 久久91精品国产91久久小草| 青青草国产成人久久91网| 性做久久久久久久久| 少妇内射兰兰久久| 91精品国产高清久久久久久国产嫩草 | 国产成人综合久久精品红| 伊人久久大香线蕉AV色婷婷色| 久久精品国产亚洲av高清漫画| 亚洲午夜精品久久久久久人妖| 久久成人国产精品一区二区| 久久亚洲AV无码精品色午夜| 国产精品久久久久9999高清| 久久久精品国产亚洲成人满18免费网站| 久久只有这精品99| 777久久精品一区二区三区无码| 亚洲国产精品综合久久网络 | 精品无码久久久久久尤物| 丰满少妇人妻久久久久久4| 久久人妻少妇嫩草AV蜜桃| 99久久精品免费看国产免费| 亚洲va中文字幕无码久久| 久久综合伊人77777麻豆| 国产精品久久久久久| 99久久国产宗和精品1上映| 久久精品国产99国产精偷| 无码人妻精品一区二区三区久久| 久久综合久久鬼色| 国産精品久久久久久久| 免费国产99久久久香蕉|