• <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個操作,每次操作修改某個區間中的值,求最后整個區間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;
            }

            發現我現場寫線段樹的能力太差,以后這種東西一定要能夠手寫,這題要好好總結一下。恩。東西學的多了,不一定是好事,對于靈活的東西一定要做到非常熟練,否則比賽的時候會很慢的。
            #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 閱讀(265) 評論(0)  編輯 收藏 引用

            久久国产高清字幕中文| 人妻无码αv中文字幕久久琪琪布| 久久天天躁狠狠躁夜夜av浪潮| 久久国产精品成人片免费| 亚洲香蕉网久久综合影视 | 国产ww久久久久久久久久| 久久久无码精品亚洲日韩蜜臀浪潮| 漂亮人妻被中出中文字幕久久| 亚洲午夜精品久久久久久浪潮| 亚洲一级Av无码毛片久久精品| 一97日本道伊人久久综合影院| 久久精品国产第一区二区| 欧美与黑人午夜性猛交久久久| 久久夜色精品国产www| 久久久高清免费视频| 国产偷久久久精品专区 | 欧美大战日韩91综合一区婷婷久久青草| 亚洲综合久久综合激情久久| 99久久婷婷国产一区二区| 久久久国产精华液| 99久久99久久精品国产片果冻| 欧洲人妻丰满av无码久久不卡| 国内精品久久久人妻中文字幕 | 精品亚洲综合久久中文字幕| 久久精品嫩草影院| 亚洲欧美日韩精品久久亚洲区 | 99久久国产综合精品网成人影院| 久久天堂电影网| 无码人妻久久一区二区三区蜜桃| 色婷婷综合久久久中文字幕| 99久久精品九九亚洲精品| 伊人热热久久原色播放www| 久久久久久人妻无码| 久久久久国产一区二区三区| 久久影院综合精品| 久久久久国产视频电影| 国产精品禁18久久久夂久| 手机看片久久高清国产日韩| 久久久久久夜精品精品免费啦| 人妻丰满?V无码久久不卡| 久久国产免费观看精品|