1

現在、セグメントツリーの問題を解決しています。問題を解決するには、怠惰な伝播の概念が必要だと思います。私はこの概念に非常に慣れていないので、コードに問題があります。

一言で言えば、問題は次のとおりです。

最初は、すべての配列要素は0であり、0からN-1のインデックスが付けられています。

コマンド1.0xyv-xとyの間の各配列インデックスの値をvで更新します

コマンド2.1xy-配列インデックスxとyの間のすべての数値の合計を出力します。

入力は整数T(≤5)で始まり、テストケースの数を示します。

各ケースには、2つの整数n(1≤n≤105)とq(1≤q≤50000)が含まれています。次の各q行には、次のいずれかの形式のタスクが含まれています。

0 xyv(0≤x≤y<n、1≤v≤1000)

1 xy(0≤x≤y<n)それぞれの場合について、最初にケース番号を印刷します。次に、クエリ「1 x y」ごとに、xとyの間のすべての配列要素の合計を出力します。これが私の試みです:

template<class T>
class SegmentTree
{
        T *tree,*update_tree;
        long size;

        public:
            SegmentTree(long N)
            {
                long x= (long)ceil(log2(N))+1;
                long size = 2*(long)pow(2,x);

                tree = new T[size];
                update_tree = new T[size];

                memset(tree,0,sizeof(tree));
                memset(update_tree,0,sizeof(update_tree));
            }

            void update(long node, long start, long end, long i, long j, long val)
            {
                if(start>j || end<i) return;
                if(start>=i && end<=j){
                    if(start==end){
                        tree[node]+=val;
                        return;
                    }
                    tree[node]+=val;
                    update_tree[2*node] += val;
                    update_tree[2*node+1]+=val;
                    return;
                }

                    long mid = (start+end)/2;
                update(2*node,start,mid,i,j,val);
                update(2*node+1,mid+1,end,i,j,val);
            }

            T query(long node, long start, long end, long i, long j, long val)
            {
                if(start>j || end<i) return -1;

                if(start>=i && end<=j)
                    return ((tree[node]+val)*(end-start+1));



                long a,b;
                a = update_tree[2*node];
                b = update_tree[2*node+1];

                 long mid = (start+end)/2;
                long val1 = query(2*node,start,mid,i,j,val+a);
                long val2 = query(2*node+1,mid+1,end,i,j,val+b);

                if(val1==-1)
                    return val2;
                if(val2==-1)
                    return val1;

                return val1+val2;

            }

};

int main()
{   
    long N,q,x,y,res;
    int tc=1, T,v,d;

    scanf("%d",&T);

    while(tc<=T)
    {
        scanf("%ld %ld",&N,&q);
        SegmentTree<long>s(N);

        printf("Case %d:\n",tc++);
        while(q--){
            scanf("%d",&d);
            if(!d){
                scanf("%ld %ld %d",&x,&y,&v);
                s.update(1,0,N-1,x,y,v);
            }
            else{
                scanf("%ld %ld",&x,&y);
                res = s.query(1,0,N-1,x,y,0);
                printf("%ld\n",res);
            }
        }
    }
    return 0;
}
4

0 に答える 0