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

            久久久久免费精品国产| 日韩欧美亚洲综合久久影院d3| 欧洲国产伦久久久久久久| 天天综合久久一二三区| 久久精品综合网| 久久成人精品视频| 国产成人综合久久精品红| 国产成年无码久久久久毛片| 久久综合亚洲色HEZYO国产| 久久精品国产亚洲AV香蕉| 人人狠狠综合久久亚洲高清| 久久久久亚洲av无码专区| 久久无码人妻精品一区二区三区| 久久狠狠爱亚洲综合影院| 久久99精品国产麻豆不卡| 久久亚洲精品中文字幕| 青青草国产97免久久费观看| 久久婷婷五月综合色高清| 久久中文精品无码中文字幕| 麻豆精品久久久一区二区| 日本久久久久亚洲中字幕| 午夜精品久久久内射近拍高清| 久久精品国产福利国产秒| 日本人妻丰满熟妇久久久久久| 无码任你躁久久久久久久| 久久这里只有精品久久| 中文字幕久久久久人妻| 伊人久久五月天| 久久精品国产一区二区 | 精品久久久久久国产牛牛app| 无码人妻精品一区二区三区久久 | 久久婷婷五月综合色奶水99啪| 热99re久久国超精品首页| 久久香蕉超碰97国产精品| 欧美黑人激情性久久| 久久综合国产乱子伦精品免费| 久久精品青青草原伊人| 99蜜桃臀久久久欧美精品网站| 99久久99久久精品国产片果冻| 日韩精品久久无码中文字幕| 影音先锋女人AV鲁色资源网久久|