社区讨论

全RE,求调!

P3372【模板】线段树 1参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lytzymcx
此快照首次捕获于
2024/07/20 18:39
2 年前
此快照最后确认于
2024/07/20 19:57
2 年前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;

struct SegTree {
    int a[N * 4], d[N * 4], lzy[N * 4];

    void pud(int l, int r, int s, int t, int p) {
        int mid = s + (t - s >> 2);
        if (lzy[p])
            d[p * 2] += lzy[p] * (mid - s + 1),
            d[p * 2 + 1] += lzy[p] * (t - mid),
            lzy[p * 2] += lzy[p],
            lzy[p * 2 + 1] += lzy[p],
            lzy[p] = 0;
        if (l <= mid) pud(l, r, s, mid, p * 2);
        if (r > mid) pud(l, r, mid + 1, t, p * 2 + 1);
    }

    void build(int s, int t, int p) {
        if (s == t) {
            d[p] = a[s];
            return;
        } int mid = s + (t - s >> 2);
        if (s <= mid) build(s, mid, p * 2);
        if (t > mid) build(mid + 1, t, p * 2 + 1);
        d[p] = d[p * 2] + d[p * 2 + 1];
    }

    int read(int l, int r, int s, int t, int p) {
        if (l <= s && t <= r) return d[p];
        int mid = s + (t - s >> 2), sum = 0;
        pud(l, r, s, t, p);
        if (l <= mid) sum += read(l, r, s, mid, p * 2);
        if (r > mid) sum += read(l, r, mid + 1, t, p * 2 + 1);
        return sum;
    }

    void add(int ad, int l, int r, int s, int t, int p) {
        if (l <= s && t <= r)
            d[p] += ad * (t - s + 1), lzy[p] += ad;
        if (s != t) pud(l, r, s, t, p);
        int mid = s + (t - s >> 2);
        if (l <= mid) add(ad, l, r, s, mid, p * 2);
        if (r > mid) add(ad, l, r, mid + 1, t, p * 2 + 1);
    }
} st;

int n, m;

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> st.a[i];
    st.build(1, n, 1);
    for (int i = 1, temp, x, y, k; i <= m; i++) {
        cin >> temp;
        if (temp == 1) {
            cin >> x >> y >> k;
            st.add(k, x, y, 1, n, 1);
        } else if (temp == 2)
            cin >> x >> y,
            cout << st.read(x, y, 1, n, 1) << endl;
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...