求助
查看原帖
求助
556649
_zhang楼主2024/7/27 22:56
#include <cstdio>
#define int long long int
const int N = 1e5;
int n, q, a[N];
struct node {
    int l, r;
    int sum, tag;
} tr[4 * N];
#define lsp(p) ((p) << 1)
#define rsp(p) ((p) << 1 | 1)
#define in_range(n1, n2, n3, n4) ((n1) <= (n2) && (n3) <= (n4))
void push_down(int p) {
    if (tr[p].l == tr[p].r || tr[p].tag == 0) return;
    tr[lsp(p)].sum += tr[p].tag * (tr[lsp(p)].r - tr[lsp(p)].l + 1);
    tr[lsp(p)].tag += tr[p].tag;
    tr[rsp(p)].sum += tr[p].tag * (tr[rsp(p)].r - tr[rsp(p)].l + 1);
    tr[rsp(p)].tag += tr[p].tag;
    tr[p].tag = 0;
}
void push_up(int p) {
    tr[p].sum = tr[lsp(p)].sum + tr[rsp(p)].sum;
}
void build(int p = 1, int l = 1, int r = n) {
    tr[p].l = l, tr[p].r = r;
    //if (l == r) printf("bld (%lld %lld), now (%lld %lld)\n", l, r, p, a[tr[p].l]);
    if (l == r) { tr[p].sum = a[tr[p].l]; return; }
    int mid = l + r >> 1;
    build(lsp(p), l, mid);
    build(rsp(p), mid + 1, r);
    push_up(p);
    //printf("bld (%lld %lld), now (%lld %lld)\n", l, r, p, tr[p].sum);
}
void update(int c, int x, int y, int p = 1) {
    //printf("upd (%lld %lld), now (%lld %lld)\n", x, y, tr[p].l, tr[p].r);
    if (in_range(x, tr[p].l, tr[p].r, y)) {
        //puts("add tag");
        tr[p].tag += c;
        tr[p].sum += tr[p].tag * (tr[p].r - tr[p].l + 1);
        return;
    }
    push_down(p);
    if (x <= tr[lsp(p)].r) update(c, x, y, lsp(p));
    if (y >= tr[rsp(p)].l) update(c, x, y, rsp(p));
    push_up(p);
}
int query(int x, int y, int p = 1) {
    if (in_range(x, tr[p].l, tr[p].r, y)) return tr[p].sum;
    push_down(p);
    int res = 0;
    if (x <= tr[lsp(p)].r) res += query(x, y, lsp(p));
    if (y >= tr[rsp(p)].l) res += query(x, y, rsp(p));
    push_up(p);
    return res;
}
signed main() {
    scanf("%lld %lld", &n, &q);
    for (int i = 1; i <= n; i++) scanf("%lld", a + i);
    build();
    while (q--) {
        int op;
        scanf("%lld", &op);
        if (op == 1) {
            int s, t, x;
            scanf("%lld %lld %lld", &s, &t, &x);
            update(x, s, t);
        } else {
            int s, t;
            scanf("%lld %lld", &s, &t);
            printf("%lld\n", query(s, t));
        }
    }
    return 0;
}

自己的第一个线段树板子求调,只过#1,其他都WA了,玄关
自己调了好久都没调好
心态崩了

2024/7/27 22:56
加载中...