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

            The Fourth Dimension Space

            枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            POJ 3468 A Simple Problem with Integers Splay樹區間操作

                接連做了維修數列和這個題,看來線段樹能做的區間操作,用splay樹應該也是可以的(都是打一個延遲標記嘛),做這題時發現有一點很重要,就是當我們壓入延遲標記的時候(不管是push_down還是C a,b,c時都需要)一定要保證這個結點代表區間的最新信息。
               
            #include <iostream>
            using namespace std;
            int const maxn=300000;

            #define bint __int64
            struct node
            {
                
            int value,size;
                
            int add;
                bint sum;
                node 
            *ch[2], *pre;
            }
            tree[maxn],*Null, *root;//設置一個Null指針是一個亮點

            int num[maxn];
            int n,m;

            int top=0;
            node 
            *New_Node(int x)
            {
                node 
            *p=&tree[top++];
                p
            ->ch[0]=p->ch[1]=p->pre=Null;
                p
            ->add=0;
                p
            ->sum=x;
                p
            ->size=1;
                p
            ->value=x;
                
            return p;
            }


            void Push_Down(node *x)//下壓延遲標記后要將子樹信息更新到最新
            {
                
            if (x == Null) return;
                x
            ->value+=x->add;
                x
            ->ch[0]->add+=x->add;
                x
            ->ch[1]->add+=x->add;
                
            if(x->ch[0]!=Null)
                    x
            ->ch[0]->sum+=(bint)(x->add)*(x->ch[0]->size);
                
            if(x->ch[1]!=Null)
                    x
            ->ch[1]->sum+=(bint)(x->add)*(x->ch[1]->size);
                x
            ->add=0;
            }


            void Update(node *x)
            {
                
            if (x == Null) return;
                x
            ->size = x->ch[0]->size + x->ch[1]->size + 1;
                x
            ->sum = (bint)x->value+ x->ch[0]->sum + x->ch[1]->sum;
            }


            void Rotate(node *x, int c)
            {
                node 
            *= x->pre;
                Push_Down(y), Push_Down(x);
                y
            ->ch[! c] = x->ch[c], x->pre = y->pre;
                
            if (x->ch[c] != Null) x->ch[c]->pre = y;
                
            if (y->pre != Null) y->pre->ch[y->pre->ch[1== y] = x;
                y
            ->pre = x, x->ch[c] = y;
                
            if (y == root) root = x;
                Update(y);
            }


            void Splay(node *x, node *f)
            {
                
            for (Push_Down(x); x->pre != f; )
                
            {
                    
            if (x->pre->pre == f)
                        Rotate(x, x
            ->pre->ch[0== x);
                    
            else
                    
            {
                        node 
            *= x->pre, *= y->pre;
                        
            if (z->ch[0== y)
                            
            if (y->ch[0== x)
                                Rotate(y, 
            1), Rotate(x, 1);
                            
            else
                                Rotate(x, 
            0), Rotate(x, 1);
                        
            else
                            
            if (y->ch[1== x)
                                Rotate(y, 
            0), Rotate(x, 0);
                            
            else
                                Rotate(x, 
            1), Rotate(x, 0);
                    }

                }

                Update(x);
            }


            void Select(int k, node *f)
            {
                node 
            *now=root;
                
            while(true)
                
            {
                    Push_Down(now);
                    
            int tmp = now->ch[0]->size;
                    
            if (tmp + 1 == k) break;
                    
            if (k <= tmp)
                        now 
            = now->ch[0];
                    
            else
                        now 
            = now->ch[1], k -= tmp + 1;
                }

                Splay(now, f);
            }




            node 
            *Make_Tree(int l, int r, node *fa)
            {
                
            if (l > r) return Null;
                
            int mid = l + r >> 1;
                node 
            *= New_Node(num[mid]);
                p
            ->ch[0= Make_Tree(l, mid-1, p);
                p
            ->ch[1= Make_Tree(mid+1, r, p);
                p
            ->pre = fa, Update(p);
                
            return p;
            }



            int main()
            {
                top
            =0;
                scanf(
            "%d%d",&n,&m);
                
            for(int i=1;i<=n;i++)
                
            {
                    scanf(
            "%d",&num[i]);
                }

                
                Null
            =New_Node(0);
                Null
            ->size=0;

                root
            =New_Node(-1);
                root
            ->ch[1]=New_Node(-1);
                root
            ->ch[1]->pre=root;
                Update(root);
                
                root
            ->ch[1]->ch[0]=Make_Tree(1,n,root->ch[1]);

                
            char s[2];
                
            for(int i=0;i<m;i++)
                
            {

                    scanf(
            "%s",s);
                    
            if(s[0]=='C')
                    
            {
                        
            int a,b,c;
                        scanf(
            "%d%d%d",&a,&b,&c);
                        Select(a,Null);
                        Select(b
            +2,root);
                        root
            ->ch[1]->ch[0]->add+=c;
                        root
            ->ch[1]->ch[0]->sum+=(bint)c*(root->ch[1]->ch[0]->size);
                    }

                    
            else
                    
            {
                        
            int a,b;
                        scanf(
            "%d%d",&a,&b);
                        Select(a,Null);
                        Select(b
            +2,root);
                        printf(
            "%I64d\n",root->ch[1]->ch[0]->sum);
                    }

                }

                
            return 0;
            }








            posted on 2010-10-22 22:26 abilitytao 閱讀(2025) 評論(0)  編輯 收藏 引用

            国产成年无码久久久久毛片| 三级片免费观看久久| 777午夜精品久久av蜜臀 | 国产精品欧美久久久天天影视| 亚洲综合伊人久久大杳蕉| jizzjizz国产精品久久| 久久精品中文字幕久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久av免费天堂小草播放| 日本五月天婷久久网站| 99999久久久久久亚洲| 久久亚洲中文字幕精品一区四| 亚洲va中文字幕无码久久| 色综合色天天久久婷婷基地| 亚洲精品国产字幕久久不卡| 九九久久精品国产| 国产欧美一区二区久久| 国产激情久久久久久熟女老人| 99久久综合狠狠综合久久| 久久久久AV综合网成人| yy6080久久| 亚洲国产成人精品久久久国产成人一区二区三区综| 色偷偷91久久综合噜噜噜噜| 国内精品伊人久久久久AV影院| 偷窥少妇久久久久久久久| 久久人妻少妇嫩草AV无码蜜桃| 国产精品久久久久久| 久久亚洲欧美国产精品| 777午夜精品久久av蜜臀| 蜜桃麻豆WWW久久囤产精品| 精品久久人人做人人爽综合| 亚洲国产精品久久久久婷婷老年| 蜜臀久久99精品久久久久久小说 | 少妇被又大又粗又爽毛片久久黑人| 久久丫精品国产亚洲av不卡| 欧美亚洲国产精品久久高清| 久久狠狠爱亚洲综合影院| 一日本道伊人久久综合影| 伊人久久大香线蕉精品不卡| 四虎国产精品免费久久| 久久综合九色综合网站|