• <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>

            ArcTan

            dfs
            隨筆 - 16, 文章 - 117, 評論 - 6, 引用 - 0
            數(shù)據(jù)加載中……

            poj 3468 線段樹

            http://poj.org/problem?id=3468

            線段數(shù)的構(gòu)造,查詢,修改!
            struct node{
               int l,r,m;
               long long sum;//當(dāng)前區(qū)間的和
               long long add;//區(qū)間需要加上的數(shù)值
            }

            題意:
                  給定n個數(shù)字A1,A2,..,An,Q個操作。
                  C x y z,把區(qū)間x y內(nèi)的數(shù)都加上z
                  Q x y,求區(qū)間x y內(nèi)所有數(shù)的和。
            總結(jié):
                  基礎(chǔ)代碼一定要對,調(diào)試了半天,最后發(fā)現(xiàn)是swap(x,y,t)寫錯了!!!!
                  WA了一次,數(shù)據(jù)是long long才行,要分析清楚數(shù)據(jù)范圍!!!

            #include <cstdio>
            #include 
            <cstdlib>
            #include 
            <cstring>
            #include 
            <cmath>
            #include 
            <ctime>
            #include 
            <cassert>
            #include 
            <iostream>
            #include 
            <sstream>
            #include 
            <fstream>
            #include 
            <map>
            #include 
            <set>
            #include 
            <vector>
            #include 
            <queue>
            #include 
            <algorithm>
            #define min(x,y) (x<y?x:y)
            #define max(x,y) (x>y?x:y)
            #define swap(x,y,t) (t=x,x=y,y=t)
            #define clr(list) memset(list,0,sizeof(list))
            #define LL long long
            #define maxn 200005
            using namespace std;
            struct node{
                
            int l,r,m;
                LL sum;
                LL add;
            } tree[
            2*maxn];
            int a[maxn];
            LL build(
            int l,int r,int root)
            {
                tree[root].l
            =l;
                tree[root].r
            =r;
                tree[root].m
            =(l+r)/2;
                tree[root].add
            =0;
                
            if (l==r)
                {
                    tree[root].sum
            =a[l];
                    
            return tree[root].sum;
                }
                
            long long sum_l=build(l,(l+r)/2,root*2);
                
            long long sum_r=build((l+r)/2+1,r,root*2+1);
                tree[root].sum
            =sum_l+sum_r;
                
            return tree[root].sum;
            }
            int insert(int l,int r,int add,int root)
            {
                
            if (l<=tree[root].l && r>=tree[root].r)
                {
                    tree[root].add
            +=add;
                    tree[root].sum
            +=add * (tree[root].r-tree[root].l+1);
                    
            return 0;
                }
                
            if (tree[root].add) //向下更新
                {
                    tree[
            2*root].sum+=tree[root].add * (tree[root*2].r-tree[root*2].l+1);
                    tree[
            2*root].add+=tree[root].add;
                    tree[
            2*root+1].sum+=tree[root].add * (tree[root*2+1].r-tree[root*2+1].l+1);
                    tree[
            2*root+1].add+=tree[root].add;
                    tree[root].add
            =0;
                }
                
            if (l<=tree[root].m)
                    insert(l,r,add,root
            *2);
                
            if (r>tree[root].m)
                    insert(l,r,add,root
            *2+1);
                tree[root].sum
            =tree[root*2].sum+tree[root*2+1].sum;   //這里回溯啊
                return 0;
            }
            LL search(
            int l,int r,int root)
            {
                
            if (l<=tree[root].l && r>=tree[root].r)
                    
            return tree[root].sum;
                
            if (tree[root].add)  //向下更新
                {
                    tree[
            2*root].sum+=tree[root].add * (tree[root*2].r-tree[root*2].l+1);
                    tree[
            2*root].add+=tree[root].add;
                    tree[
            2*root+1].sum+=tree[root].add * (tree[root*2+1].r-tree[root*2+1].l+1);
                    tree[
            2*root+1].add+=tree[root].add;
                    tree[root].add
            =0;
                }
                LL sum_l
            =0,sum_r=0;
                
            if (l<=tree[root].m)
                    sum_l
            =search(l,r,2*root);
                
            if (r>tree[root].m)
                    sum_r
            =search(l,r,2*root+1);
                
            return sum_l+sum_r;
            }
            int main()
            {
                
            int n,m;
                
            int x,y,z;
                
            int tmp;
                
            char ch;
                scanf(
            "%d%d",&n,&m);
                
            for (int i=1;i<=n;i++)
                    scanf(
            "%d",&a[i]);
                build(
            1,n,1);

                
            for (int i=1;i<=m;i++)
                {
                    scanf(
            "\n%c",&ch);
                    
            if (ch=='C')
                    {
                        scanf(
            "%d%d%d",&x,&y,&z);
                        
            if (x>y)
                            swap(x,y,tmp);
                        insert(x,y,z,
            1);
                    }
                    
            else
                    {
                        scanf(
            "%d%d",&x,&y);
                        
            if (x>y)
                            swap(x,y,tmp);
                        printf(
            "%I64d\n",search(x,y,1));
                    }
                }
                
            return 0;
            }


            posted on 2012-07-25 10:54 wangs 閱讀(413) 評論(0)  編輯 收藏 引用 所屬分類: ACM-數(shù)據(jù)結(jié)構(gòu)

            国产精品美女久久久久网| 色狠狠久久综合网| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 青青热久久国产久精品| 久久久久久综合网天天| 青青草原综合久久大伊人精品| 亚洲欧美国产日韩综合久久| 无码人妻精品一区二区三区久久 | 久久久久久国产精品无码下载| 久久人妻少妇嫩草AV蜜桃| 久久久老熟女一区二区三区| 久久香蕉国产线看观看乱码| 久久无码高潮喷水| 久久国产免费直播| 国产99久久精品一区二区| 久久国产亚洲精品| 伊人久久免费视频| 国产91久久精品一区二区| 久久久久se色偷偷亚洲精品av| 精品久久久久久久中文字幕 | 亚洲国产二区三区久久| 日韩人妻无码一区二区三区久久| 久久影视综合亚洲| 国产精品美女久久久久AV福利| 国内精品久久久人妻中文字幕| 亚洲天堂久久久| 亚洲精品无码久久毛片| 久久亚洲2019中文字幕| 久久久久久国产精品美女| 国产精品免费久久久久久久久 | 93精91精品国产综合久久香蕉| 久久精品国产亚洲AV无码麻豆 | 66精品综合久久久久久久| 精品久久久无码人妻中文字幕豆芽| 久久九九兔免费精品6| 婷婷国产天堂久久综合五月| 中文成人久久久久影院免费观看| 欧美久久亚洲精品| 久久久www免费人成精品| 久久人人爽人人爽人人av东京热 | 午夜福利91久久福利|