求助站外题:线段树
  • 板块学术版
  • 楼主Cristimezzz
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/11/6 22:06
  • 上次更新2023/11/4 01:13:26
查看原帖
求助站外题:线段树
197435
Cristimezzz楼主2021/11/6 22:06

最近才学线段树,想用线段树解决树状数组区间修改单点查询的问题,但是不知道哪里出了问题, WA 0pts,请巨佬指教!

原题:https://loj.ac/p/131

提交信息:https://loj.ac/s/1295186

代码:

// Problem: #131. 树状数组 2 :区间修改,单点查询
// Contest: LibreOJ
// URL: https://loj.ac/p/131
// Memory Limit: 256 MB
// Time Limit: 3000 ms

#include <cctype>
#include <cstdio>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

#define int ll
const int MAXN = 1e6 + 10;

inline int read() {
    int x = 0, f = 1;
    char ch = getchar();

    while (!isdigit(ch)) {
        if (ch == '-')
            f = -1;

        ch = getchar();
    }

    while (isdigit(ch)) {
        x = x * 10 + ch - '0';
        ch = getchar();
    }

    return x * f;
}

namespace SegTree {
int tree[MAXN << 2], tag[MAXN << 2];

inline int lson(const int k) {
    return k << 1;
}
inline int rson(const int k) {
    return (k << 1) + 1;
}
inline void pushup(const int k) {
    tree[k] = tree[lson(k)] + tree[rson(k)];
}
inline void pushdown(const int k, const int l, const int r) {
    const int mid = l + ((r - l) >> 1);
    tree[lson(k)] += tag[k] * (mid - l + 1);
    tree[rson(k)] += tag[k] * (r - mid);
    tag[lson(k)] += tag[k];
    tag[rson(k)] += tag[k];
    tag[k] = 0;
}
void build(int k, int l, int r) {
    if (l == r) {
        tree[k] = read();
        return;
    }

    int mid = l + ((r - l) >> 1);
    build(lson(k), l, mid);
    build(rson(k), mid + 1, r);
    pushup(k);
}
void update(int s, int t, int delta, int k, int l, int r) {
    if (s <= l && r <= t) {
        tree[k] += delta * (r - l + 1);
        tag[k] += delta;
        return;
    }

    if (!tag[k] && s != t)
        pushdown(k, l, r);

    int mid = l + ((r - l) >> 1);

    if (s <= mid)
        update(s, t, delta, lson(k), l, mid);

    if (mid < t)
        update(s, t, delta, rson(k), mid + 1, r);

    pushup(k);
}
int query(int s, int t, int k, int l, int r) {
    if (s <= l && r <= t)
        return tree[k];

    if (!tag[k])
        pushdown(k, l, r);

    int mid = l + ((r - l) >> 1), sum = 0;

    if (s <= mid)
        sum += query(s, t, lson(k), l, mid);

    if (mid < t)
        sum += query(s, t, rson(k), mid + 1, r);

    return sum;
}
} // namespace SegTree

signed main(void) {
    // Code here
    int n = read(), q = read();
    SegTree::build(1, 1, n);

    while (q--) {
        int op = read();

        if (op == 1) {
            int l = read(), r = read(), x = read();
            SegTree::update(l, r, x, 1, 1, n);
        } else {
            int i = read();
            printf("%lld\n", SegTree::query(i, i, 1, 1, n));
        }
    }

    return 0;
}
2021/11/6 22:06
加载中...