• <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)  編輯 收藏 引用 所屬分類: 線段樹

            亚洲精品白浆高清久久久久久 | 久久久久久伊人高潮影院| 久久久WWW成人免费精品| 久久九九久精品国产| 久久午夜夜伦鲁鲁片免费无码影视| 无码人妻精品一区二区三区久久| 韩国三级大全久久网站| 久久伊人精品青青草原日本| 亚洲日本va中文字幕久久| 国产ww久久久久久久久久| 亚洲国产成人精品久久久国产成人一区二区三区综 | 免费精品国产日韩热久久| 日日躁夜夜躁狠狠久久AV| 国产999精品久久久久久| 亚洲精品无码成人片久久| 丰满少妇人妻久久久久久4| 性欧美大战久久久久久久久| 国产三级精品久久| 久久成人精品视频| 久久国产乱子伦免费精品| 伊人久久大香线蕉无码麻豆| 精品国产乱码久久久久久浪潮| 无码精品久久久天天影视| 少妇被又大又粗又爽毛片久久黑人| 99精品国产在热久久| 中文字幕久久久久人妻| 国产精品久久新婚兰兰| 亚洲欧洲久久av| 一级a性色生活片久久无| 久久久久国产日韩精品网站| 26uuu久久五月天| 91精品国产91热久久久久福利| 久久综合久久综合久久| 久久久久久久尹人综合网亚洲| 久久超乳爆乳中文字幕| 国产99精品久久| 亚洲午夜久久影院| 激情综合色综合久久综合| 欧美久久久久久精选9999| 亚洲欧洲中文日韩久久AV乱码| 一级a性色生活片久久无|