1 条题解

  • 0
    @ 2024-10-8 15:29:29

    树状数组

    线段树

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e6 + 1;
    int n, m, a[N];
    struct Node {
        int l, r;
        ll sum, lazy;
    } tr[N << 2];
    
    void pushup(Node& u, Node& l, Node& r) {
        u.sum = l.sum + r.sum;
    }
    void pushup(int u) {
        pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
    }
    void pushdown(int u) {
        if (tr[u].lazy) {
            tr[u << 1].sum += (tr[u << 1].r - tr[u << 1].l + 1) * tr[u].lazy;
            tr[u << 1].lazy += tr[u].lazy;
            tr[u << 1 | 1].sum += (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) * tr[u].lazy;
            tr[u << 1 | 1].lazy += tr[u].lazy;
            tr[u].lazy = 0;
        }
    }
    void build(int u, int l, int r) {
        // printf("build: %d %d\n",l,r);
        tr[u].l = l, tr[u].r = r;
        if (l == r) {
            tr[u].sum = a[l]; return;
        }
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
    void modify(int u, int l, int r, int x) {
        // printf("modify: %d %d %d %d\n",u,l,r,x);
        if (l <= tr[u].l && r >= tr[u].r) {
            tr[u].lazy += x;
            tr[u].sum += 1ll*(tr[u].r - tr[u].l + 1) * x;
            return;
        }
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid) modify(u << 1, l, r, x);
        if (r > mid) modify(u << 1 | 1, l, r, x);
        pushup(u);
    }
    Node query(int u, int l, int r) {
        // printf("query: %d %d %d\n",u,l,r);
        if (l <= tr[u].l && r >= tr[u].r) return tr[u];
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        // printf("query:mid = %d\n", mid);
        Node left = {0, 0, 0, 0}, right = {0, 0, 0, 0};
        if (l <= mid) left = query(u << 1, l, r);
        if (r > mid) right = query(u << 1 | 1, l, r);
        Node res;
        pushup(res, left, right);
        return res;
    }
    int read() {
        int res = 0, f = 1;
        char c;
        while ((c = getchar()) < '0' || c > '9')
            if (c == '-') f = -1;
        res = c - '0';
        while ((c = getchar()) >= '0' && c <= '9')
            res = res * 10 + c - '0';
        return res * f;
    }
    int main() {
        n = read(), m = read();
        for (int i = 1; i <= n; i++) a[i] = read();
        build(1, 1, n);
        int op, l, r, x;
        while (m--) {
            op = read(), l = read(), r = read();
            if (op == 1) {
                x = read(), modify(1, l, r, x);
            } else printf("%lld\n", query(1, l, r).sum);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1679
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    34
    已通过
    2
    上传者