• <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>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0
            題目大意:給出一個序列,和三種操作:1、將[a,b]中的數一齊加上一個數;2、將[a,b]中的數一齊乘上一個數;3、輸出[a,b]中數的和模p的結果。
            很顯然需要用線段樹維護。
            以下是我的代碼,如果有測試數據的話請不吝共享:
            #include<stdio.h>
            #define maxn 100007
            #define L(x) (x<<1)
            #define R(x) ((x<<1)+1)
            typedef 
            long long int64;
            struct
            {
                
            long a,b;
                int64 add,mul,sum;
                
            bool cover;
            }seg[maxn
            *3];
            long n,p,m,r[maxn];
            //  Var
            void build(long node,long x,long y)
            {
                
            long mid=(x+y)>>1;
                seg[node].a
            =x;seg[node].b=y;
                seg[node].add
            =0;seg[node].mul=1;
                seg[node].cover
            =false;
                
            if(x==y)
                  seg[node].sum
            =r[x]%p;
                
            else if(x<y)
                {
                   build(L(node),x,mid);
                   build(R(node),mid
            +1,y);
                   seg[node].sum
            =(seg[L(node)].sum+seg[R(node)].sum)%p;
                }
            }
            void update(long node)
            {
                
            if(seg[node].cover)
                {
                   seg[L(node)].sum
            =(seg[L(node)].sum*seg[node].mul%p+seg[node].add*(seg[L(node)].b-seg[L(node)].a+1)%p)%p;
                   seg[R(node)].sum
            =(seg[R(node)].sum*seg[node].mul%p+seg[node].add*(seg[R(node)].b-seg[R(node)].a+1)%p)%p;
                   seg[L(node)].mul
            *=seg[node].mul;seg[L(node)].mul%=p;
                   seg[R(node)].mul
            *=seg[node].mul;seg[R(node)].mul%=p;
                   seg[L(node)].add
            *=seg[node].mul;seg[L(node)].add%=p;
                   seg[R(node)].add
            *=seg[node].mul;seg[R(node)].add%=p;
                   seg[L(node)].add
            +=seg[node].add;seg[L(node)].add%=p;
                   seg[R(node)].add
            +=seg[node].add;seg[R(node)].add%=p;
                   seg[L(node)].cover
            =seg[R(node)].cover=true;
                   seg[node].add
            =0;seg[node].mul=1;
                   seg[node].cover
            =false;
                }
            }
            void handle_1(long node,long x,long y,long mulc)
            {
                
            long a=seg[node].a,b=seg[node].b,mid=(a+b)>>1;
                
            if(x<=a&&b<=y)
                {
                   seg[node].mul
            *=mulc;seg[node].mul%=p;
                   seg[node].add
            *=mulc;seg[node].add%=p;
                   seg[node].sum
            =seg[node].sum*mulc%p;
                   seg[node].cover
            =true;
                }
                
            else
                {
                   update(node);
                   
            if(mid>=x)
                     handle_1(L(node),x,y,mulc);
                   
            if(mid+1<=y)
                     handle_1(R(node),x,y,mulc);
                   seg[node].sum
            =(seg[L(node)].sum+seg[R(node)].sum)%p;
                }
            }
            void handle_2(long node,long x,long y,long addc)
            {
                
            long a=seg[node].a,b=seg[node].b,mid=(a+b)>>1;
                
            if(x<=a&&b<=y)
                {
                   seg[node].add
            +=addc;seg[node].add%=p;
                   seg[node].sum
            =(seg[node].sum+addc*(seg[node].b-seg[node].a+1)%p)%p;
                   seg[node].cover
            =true;
                }
                
            else
                {
                   update(node);
                   
            if(mid>=x)
                     handle_2(L(node),x,y,addc);
                   
            if(mid+1<=y)
                     handle_2(R(node),x,y,addc);
                   seg[node].sum
            =(seg[L(node)].sum+seg[R(node)].sum)%p;
                }
            }
            int64 handle_3(
            long node,long x,long y)
            {
                
            long a=seg[node].a,b=seg[node].b,mid=(a+b)>>1;
                int64 re
            =0;
                
            if(x<=a&&b<=y)
                  re
            =seg[node].sum;
                
            else
                {
                   update(node);
                   
            if(mid>=x)
                     re
            =(re+handle_3(L(node),x,y))%p;
                   
            if(mid+1<=y)
                     re
            =(re+handle_3(R(node),x,y))%p;
                   seg[node].sum
            =(seg[L(node)].sum+seg[R(node)].sum)%p;
                }
                
            return re%p;//  為了安全多做一次mod運算 
            }
            int main()
            {
                
            //*
                freopen("seq.in","r",stdin);
                freopen(
            "seq.out","w",stdout);
                
            //*/
                scanf("%ld%ld",&n,&p);
                
            for(long i=1;i<=n;i++) scanf("%ld",&r[i]);
                build(
            1,1,n);
                scanf(
            "%ld",&m);
                
            while(m--)
                {
                   
            long cmd,t,g,c;
                   scanf(
            "%ld",&cmd);
                   
            switch(cmd)
                   {
                      
            case 1:
                         scanf(
            "%ld%ld%ld",&t,&g,&c);
                         c
            %=p;
                         handle_1(
            1,t,g,c);
                         
            break;
                      
            case 2:
                         scanf(
            "%ld%ld%ld",&t,&g,&c);
                         c
            %=p;
                         handle_2(
            1,t,g,c);
                         
            break;
                      
            case 3:
                         scanf(
            "%ld%ld",&t,&g);
                         printf(
            "%I64d\n",handle_3(1,t,g));
                   }
                }
            return 0;
            }

            程序已AC。
            posted on 2010-02-28 10:30 lee1r 閱讀(573) 評論(2)  編輯 收藏 引用 所屬分類: 題目分類:數據結構

            FeedBack:
            # re: AHOI 2009 行星序列
            2010-03-14 14:16 | ray
            # re: AHOI 2009 行星序列
            2010-04-24 22:55 | Study
            能再寫一個有注釋的代碼吧,如能真是感謝啊!  回復  更多評論
              
            四虎国产精品免费久久5151| 国产亚洲美女精品久久久2020| 国产精品久久国产精麻豆99网站| 97久久超碰国产精品旧版| 香港aa三级久久三级| 日本亚洲色大成网站WWW久久| 综合久久国产九一剧情麻豆| 97久久综合精品久久久综合| 欧美一级久久久久久久大片| 久久这里只有精品首页| 狠狠干狠狠久久| 伊人久久一区二区三区无码| 国产亚洲精品自在久久| 亚洲国产成人久久一区WWW| 91精品国产综合久久婷婷| 天天综合久久一二三区| 国产精品久久成人影院| 无码人妻精品一区二区三区久久久| 国产精品免费久久久久久久久| 99久久夜色精品国产网站| 狠狠久久综合| 欧美久久综合性欧美| 男女久久久国产一区二区三区| 欧美久久亚洲精品| 久久久久无码精品国产app| 久久99精品综合国产首页| 99久久成人国产精品免费| 婷婷综合久久中文字幕蜜桃三电影| 色偷偷88欧美精品久久久 | 日韩精品久久久久久久电影蜜臀| 久久国产精品免费一区二区三区 | 亚洲国产香蕉人人爽成AV片久久| 久久国产精品99精品国产987| 久久久久人妻一区二区三区vr| 中文字幕日本人妻久久久免费| 久久99这里只有精品国产| 亚洲七七久久精品中文国产| 国产成人综合久久精品红| 久久久无码精品亚洲日韩京东传媒 | 99久久精品国产一区二区三区| 91精品国产9l久久久久|