查找段树实现中的错误

时间:2017-02-15 04:52:19

标签: segment-tree

我试图解决这个问题 - link。具有延迟传播的段树。但我不知道我弄错了什么。请帮我找一下这个bug 我是Lazy Propagation的Segment Tree新手。但我的代码似乎没问题。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000; 
struct info{ long long sum, prop; }; info tree[300010];
void update(int node, int l, int r, int i, int j,  int val) {
    if( i > r || j < l) return; 
    if(i <= l && j >= r) {
        tree[node].sum += (r-l+1)*val; 
        tree[node].prop += val;
        return;
    } int left = node*2, right = left|1, mid = (l+r)/2;
    update(left, l, mid, i,j,val); 
    update(right, mid+1, r, i,j,val);
    tree[node].sum = tree[left].sum + tree[right].sum + (r-l+1)*tree[node].prop;
}
long long query(int node, int l, int r, int i, int j, long long carry = 0) {
    if(i > r || j < l ) return 0;
    if(i <= l && j >= r) return tree[node].sum + (r-l+1)*carry;
    int mid = (l+r)/2, left = node*2, right = left|1; 
    long long ret = query(left, l, mid, i,j, carry + tree[node].prop); 
    ret += query(right,mid+1,r,i,j, carry + tree[node].prop);
    return ret;
}
int main(int argc, char const *argv[]) {
#ifndef ONLINE_JUDGE
    freopen("in", "r", stdin);
#endif
    int t,co=0; scanf("%d", &t); while(t--) {
        int n, q; scanf("%d %d", &n, &q);
        for(int i=0; i<=3*n; i++) tree[i].sum = tree[i].prop = 0;
        printf("Case %d:\n", ++co);
        while(q--) { 
            int type,a,b,c; scanf("%d", &type); if(!type) {
                scanf("%d %d %d", &a, &b, &c); 
                update(1, 0, n-1, a,b,c);
            } else {
                scanf("%d %d", &a, &b); 
                printf("%d\n", query(1, 0, n-1, a,b));
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

首先,这个网站不是用于查找代码中的错误。为此,请尝试https://codereview.stackexchange.com/

无论如何在你的代码返回类型的函数query()很长但在main中你打印整数类型。将printf("%d\n", query(1, 0, n-1, a,b));更改为printf("%lld\n", query(1, 0, n-1, a,b));,我希望您能获得AC。