码风优良,悬关求调

P3372 【模板】线段树 1

talentedbug @ 2024-10-23 18:16:48

#include <bits/stdc++.h>
#define int long long
#define BUGS_DEBUG

using namespace std;
int n, m;
int a[120000];
struct stree {
    int l, r;
    int v;
    int p;
} st[420000];

void build(int p, int l, int r) {
    st[p].l = l, st[p].r = r;
    if (l == r) {
        st[p].v = a[l];
        return;
    }
    int mid = (l + r) / 2;
    build(p * 2, l, mid);
    build(p * 2 + 1, mid + 1, r);
    st[p].v = st[p * 2].v + st[p * 2 + 1].v;
}

inline void pushdown(int p) {
    if (st[p].p) {
        st[p * 2].v += st[p * 2].p * (st[p * 2].r - st[p * 2].l);
        st[p * 2 + 1].v = st[p].p * (st[p * 2 + 1].r - st[p * 2 + 1].l + 1);
        st[p * 2].p += st[p].p;
        st[p * 2 + 1].p += st[p].p;
        st[p].p = 0;
    }
}

void modify(int p, int l, int r, int v) {
    if (l <= st[p].l && r >= st[p].r) {
        st[p].v += v * (st[p].r - st[p].l + 1);
        st[p].p += v;
        return;
    }
    pushdown(p);
    int mid = (st[p].l + st[p].r) / 2;
    if (l <= mid) {
        modify(p * 2, l, r, v);
    }
    if (r > mid) {
        modify(p * 2 + 1, l, r, v);
    }
    st[p].v = st[p * 2].v + st[p * 2 + 1].v;
}

int query(int p, int l, int r) {
    if (l <= st[p].l && r >= st[p].r) {
        return st[p].v;
    }
    pushdown(p);
    int mid = (st[p].l + st[p].r) / 2;
    int tot = 0;
    if (l <= mid) {
        tot += query(2 * p, l, r);
    }
    if (r > mid) {
        tot += query(2 * p + 1, l, r);
    }
    return tot;
}

signed main() {
    int n, m;
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &a[i]);
    }
    build(1, 1, n);
    for (int i = 1; i <= m; i++) {
        int op;
        scanf("%lld", &op);
        if (op == 1) {
            int l, r, v;
            scanf("%lld%lld%lld", &l, &r, &v);
            modify(1, l, r, v);
        } else {
            int l, r;
            scanf("%lld%lld", &l, &r);
            printf("%lld\n", query(1, l, r));
        }
    }
    return 0;
}

by _空白_ @ 2024-10-23 18:19:58

@talentedbug pushdown 第二行区间长度没 +1


by _cbw @ 2024-10-23 18:21:47

pushdown 写错了

        st[p * 2].v += st[p].p * (st[p * 2].r - st[p * 2].l + 1);
        st[p * 2 + 1].v += st[p].p * (st[p * 2 + 1].r - st[p * 2 + 1].l + 1);
        st[p * 2].p += st[p].p;
        st[p * 2 + 1].p += st[p].p;
        st[p].p = 0;

by _cbw @ 2024-10-23 18:23:31

长度没加1,+= 写成 =


by adsd45666 @ 2024-10-23 18:24:54

确实,改正后即可AC


by talentedbug @ 2024-10-23 21:04:58

感谢大佬帮助 %%%


|