社区讨论

求一个言简意赅【呸】的线段树板子

P3374【模板】树状数组 1参与者 7已保存回复 10

讨论操作

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

当前回复
10 条
当前快照
1 份
快照标识符
@mi6yk3tu
此快照首次捕获于
2025/11/20 12:55
4 个月前
此快照最后确认于
2025/11/20 12:55
4 个月前
查看原帖
本蒟蒻丑陋的线段树。。。
CPP
// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N = 500005;
int ans, n, m;
struct Node{
    int l, r, val;
}tree[4 * N];
inline int read(){
    int f = 0, x = 0; char ch;
    do {ch = getchar(); f |= ch == '-';} while (!isdigit(ch));
    do {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();} while (isdigit(ch));
    return f ? -x : x;
}
inline void build(int l, int r, int k){
    tree[k].l = l, tree[k].r = r;
    if (tree[k].l == tree[k].r){
        tree[k].val = read();
        return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, k << 1);
    build(mid + 1, r, k << 1 | 1);
    tree[k].val = tree[k << 1].val + tree[k << 1 | 1].val;
}
inline int ask(int x, int k){
    if (tree[k]. l == tree[k].r){
        return tree[k].val;
    }
    int mid = (tree[k].l + tree[k].r) >> 1;
    return x <= mid ? ask(k << 1, x) : ask(k << 1 | 1, x);
}
inline void getsum(int l, int r, int k){
    if (l <= tree[k].l && tree[k].r <= r){
        ans += tree[k].val;
        return;
    }
    int mid = (tree[k].l + tree[k].r) >> 1;
    if (l <= mid)getsum(l, r, k << 1);
    if (r > mid)getsum(l, r, k << 1 | 1); 
}
inline void updata(int x, int p, int k){
    if (tree[k].l == tree[k].r){
        tree[k].val += p;
        return;
    }
    int mid = (tree[k].l + tree[k].r) >> 1;
    if (x <= mid)updata(x, p, k << 1);
    if (x > mid)updata(x, p, k << 1 | 1);
    tree[k].val = tree[k << 1].val + tree[k << 1 | 1].val;
}
int main(){
    n = read(), m = read();
    build(1, n, 1);
    for (re int i = 1; i <= m; ++i){
        int cz = read();
        if (cz == 1){
            int x = read(), k = read();
            updata(x, k, 1);
        }
        else{
            int x = read(), y = read();
            getsum(x, y, 1);
            printf("%d\n", ans);
            ans = 0;
        }
    }
    return 0;
} 

回复

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

正在加载回复...