社区讨论

TLE求调

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

讨论操作

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

当前回复
12 条
当前快照
1 份
快照标识符
@mexpmgd8
此快照首次捕获于
2025/08/30 11:36
6 个月前
此快照最后确认于
2025/11/04 06:09
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 201000;

ll n, m, a[N];

struct LineTree {
    ll sum;
} seg[N * 4];

inline void update(int id) {
    seg[id].sum = seg[id * 2].sum + seg[id * 2 + 1].sum;
}

inline void build(int id, int l, int r) {
    if (l == r) seg[id].sum = a[l];
    else {
        int mid = (l + r) / 2;
        build(id * 2, l, mid);
        build(id * 2 + 1, mid + 1, r);
        update(id);
    }
}

inline void add(int id, int l, int r, int lpos, int rpos, ll k) {
    if (l == r) seg[id].sum += k;
    else {
        int mid = (l + r) / 2;
        if (rpos <= mid) add(id * 2, l, mid, lpos, rpos, k);
        else if (lpos > mid) add(id * 2 + 1, mid + 1, r, lpos, rpos, k);
        else {
            add(id * 2, l, mid, lpos, mid, k);
            add(id * 2 + 1, mid + 1, r, mid + 1, rpos, k);
        }
        update(id);
    }
}

inline ll query(int id, int l, int r, int ql, int qr) {
    if (l == ql && r == qr) return seg[id].sum;
    else {
        int mid = (l + r) / 2;
        if (qr <= mid) return query(id * 2, l, mid, ql, qr);
        else if (ql > mid) return query(id * 2 + 1, mid + 1, r, ql, qr);
        else {
            return query(id * 2, l, mid, ql, mid) + query(id * 2 + 1, mid + 1, r, mid + 1, qr);
        }
        update(id);
    }
}

int main() {
    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 opt, x, y;
        ll k;
        scanf("%d%d%d", &opt, &x, &y);
        if (opt == 1) {
            scanf("%lld", &k);
            add(1, 1, n, x, y, k);
        } else {
            printf("%lld\n", query(1, 1, n, x, y));
        }
    }
}
(抄老师的板子)

回复

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

正在加载回复...