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

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

            HDOJ 1698 Just a Hook 線段樹

            題目的意思是給你一個數組,大小是N,初始的時候,a[1-N]均為1,然后有Q個操作,每次操作修改某個區(qū)間中的值,求最后整個區(qū)間1-N的和。線段樹解決

            #include<iostream>
            using namespace std;

            int const maxn=100100;

            struct node
            {
                
            int n;
                
            int l,r;
            }
            tree[maxn*4];

            void build(int l,int r,int i)
            {
                tree[i].l
            =l;
                tree[i].r
            =r;
                
            if(l==r)
                    
            return;

                
            int mid=(l+r)>>1;
                build(l,mid,i
            *2);
                build(mid
            +1,r,i*2+1);
            }


            void update(int l,int r,int n,int i)
            {
                
            if(l==tree[i].l&&r==tree[i].r)
                
            {
                    tree[i].n
            =n;
                    
            return ;
                }

                
            if(l>r)
                    
            return ;
                
            int nn=tree[i].n;
                
            if(tree[i].n!=0)
                
            {
                    
            if(l!=tree[i].l||r!=tree[i].r)
                    
            {
                        
                        
            int mid=(tree[i].l+tree[i].r)>>1;
                        
            if(r<=mid)
                        
            {
                            update(l,r,n,i
            *2);
                            update(tree[i].l,l
            -1,nn,i*2);
                            update(r
            +1,mid,nn,i*2);
                            update(mid
            +1,tree[i].r,nn,i*2+1);
                        }

                        
            else if(l>mid)
                        
            {
                            update(l,r,n,i
            *2+1);
                            update(r
            +1,tree[i].r,nn,i*2+1);
                            update(mid
            +1,l-1,nn,i*2+1);
                            update(tree[i].l,mid,nn,i
            *2);

                        }

                        
            else
                        
            {
                            update(l,mid,n,i
            *2);
                            update(mid
            +1,r,n,i*2+1);
                            update(tree[i].l,l
            -1,nn,i*2);
                            update(r
            +1,tree[i].r,nn,i*2+1);
                        }

                        
                    }

                    tree[i].n
            =0;
                }


                
            else if(tree[i].n==0)
                
            {
                    
            if(l!=tree[i].l||r!=tree[i].r)
                    
            {
                        
            int mid=(tree[i].l+tree[i].r)>>1;
                        
            if(r<=mid)
                            update(l,r,n,i
            *2);
                        
            else if(l>mid)
                            update(l,r,n,i
            *2+1);
                        
            else
                        
            {
                            update(l,mid,n,i
            *2);
                            update(mid
            +1,r,n,i*2+1);
                        }

                    }

                }

            }



            int Que(int l,int r,int i)
            {
                
            int ans=0;
                
            if(tree[i].l==l&&tree[i].r==r&&tree[i].n!=0)
                
            {
                    ans
            =(r-l+1)*tree[i].n;
                    
            return ans;
                }

                
            else
                
            {
                    
            int mid=(tree[i].l+tree[i].r)>>1;
                    
            if(r<=mid)
                        ans
            = Que(l,r,i*2);
                    
            else if(l>mid)
                        ans
            = Que(l,r,i*2+1);
                    
            else
                         ans
            =Que(l,mid,i*2)+Que(mid+1,r,i*2+1);
                    
            return ans;
                }

            }




            int main()
            {
                
            int ca;
                scanf(
            "%d",&ca);
                
            int t=0;
                
            while(ca--)
                
            {
                    t
            ++;

                    
            int n;
                    scanf(
            "%d",&n);
                    build(
            1,n,1);
                    tree[
            1].n=1;
                    
            int q;
                    scanf(
            "%d",&q);
                    
            int i;
                    
            for(i=1;i<=q;i++)
                    
            {
                        
            int a,b,c;
                        scanf(
            "%d%d%d",&a,&b,&c);
                        update(a,b,c,
            1);
                    }

                    printf(
            "Case %d: The total value of the hook is %d.\n",t,Que(1,n,1));
                }

                
            return 0;
            }

            發(fā)現我現場寫線段樹的能力太差,以后這種東西一定要能夠手寫,這題要好好總結一下。恩。東西學的多了,不一定是好事,對于靈活的東西一定要做到非常熟練,否則比賽的時候會很慢的。
            #include<iostream>
            using namespace std;
            int const maxn=100100;

            struct node
            {
                
            int n;
                
            int l,r;
            }
            tree[maxn*4];

            void build(int l,int r,int i)
            {
                tree[i].l
            =l;
                tree[i].r
            =r;
                tree[i].n
            =1;
                
            if(l==r)
                    
            return;

                
            int mid=(l+r)>>1;
                build(l,mid,i
            *2);
                build(mid
            +1,r,i*2+1);
            }


            void update(int l,int r,int n,int i)
            {
                
            int nn=tree[i].n;
                
            if(l==tree[i].l&&r==tree[i].r)
                
            {
                    tree[i].n
            =n;
                    
            return ;
                }

                
            if(tree[i].n!=0)
                
            {
                    tree[i
            *2].n=tree[i].n;
                    tree[i
            *2+1].n=tree[i].n;
                    tree[i].n
            =0;
                }

                
            int mid=(tree[i].l+tree[i].r)>>1;
                
            {
                    
            if(r<=mid)
                        update(l,r,n,i
            *2);
                    
            else if(l>mid)
                        update(l,r,n,i
            *2+1);
                    
            else
                    
            {
                        update(l,mid,n,i
            *2);
                        update(mid
            +1,r,n,i*2+1);
                    }

                }

                
            }



            int Que(int l,int r,int i)
            {
                
            int ans=0;
                
            if(tree[i].l==l&&tree[i].r==r&&tree[i].n!=0)
                
            {
                    ans
            =(r-l+1)*tree[i].n;
                    
            return ans;
                }

                
            else
                
            {
                    
            int mid=(tree[i].l+tree[i].r)>>1;
                    
            if(r<=mid)
                        ans
            = Que(l,r,i*2);
                    
            else if(l>mid)
                        ans
            = Que(l,r,i*2+1);
                    
            else
                        ans
            =Que(l,mid,i*2)+Que(mid+1,r,i*2+1);
                    
            return ans;
                }

            }




            int main()
            {
                
            int ca;
                scanf(
            "%d",&ca);
                
            int t=0;
                
            while(ca--)
                
            {
                    t
            ++;

                    
            int n;
                    scanf(
            "%d",&n);
                    build(
            1,n,1);
                    tree[
            1].n=1;
                    
            int q;
                    scanf(
            "%d",&q);
                    
            int i;
                    
            for(i=1;i<=q;i++)
                    
            {
                        
            int a,b,c;
                        scanf(
            "%d%d%d",&a,&b,&c);
                        update(a,b,c,
            1);
                    }

                    printf(
            "Case %d: The total value of the hook is %d.\n",t,Que(1,n,1));
                }

                
            return 0;
            }

            posted on 2010-07-17 11:42 abilitytao 閱讀(268) 評論(0)  編輯 收藏 引用

            无码任你躁久久久久久| 色妞色综合久久夜夜| 色偷偷888欧美精品久久久| 久久精品国产亚洲综合色| 青青青青久久精品国产h久久精品五福影院1421| 久久精品国产一区二区| 亚洲а∨天堂久久精品9966| 亚洲精品乱码久久久久66| 99久久夜色精品国产网站| 久久中文字幕人妻丝袜| 久久久久久综合一区中文字幕| 亚洲国产天堂久久综合| 久久综合丁香激情久久| 久久久久久精品免费免费自慰| 青青草国产成人久久91网| 国产精品99久久久精品无码 | 亚洲国产精品久久久久婷婷软件| 狠狠色丁香婷婷综合久久来来去| 色偷偷偷久久伊人大杳蕉| 亚洲?V乱码久久精品蜜桃 | 久久精品这里只有精99品| 亚洲精品美女久久久久99| 久久午夜免费视频| 国产精品免费久久| 无码任你躁久久久久久老妇App| 久久久国产99久久国产一| 国产亚洲美女精品久久久2020| 无码精品久久久久久人妻中字| 国产午夜精品理论片久久| 欧美丰满熟妇BBB久久久| 思思久久好好热精品国产| 久久se精品一区二区影院| 久久er国产精品免费观看2| 麻豆AV一区二区三区久久| 一本一本久久a久久综合精品蜜桃| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久精品国产欧美日韩| 91亚洲国产成人久久精品网址| 国产精品久久久久久影院| 91精品国产91久久久久福利| 99久久99久久|