提供一组Debug样例
查看原帖
提供一组Debug样例
195913
tudouuuuu楼主2020/10/29 19:27

不知道为什么自己开始YY主席树区间修改导致一直WA

错误示范:

class HJT {
public:
    int ch[MAXN * 70][2];
    ll sum[MAXN * 70], add[MAXN * 70];
    int tot;

    inline void push_up(int rt) {
        sum[rt] = sum[ch[rt][0]] + sum[ch[rt][1]];
    }

    int build(int l, int r) {
        int nrt = ++tot;
        ch[nrt][0] = ch[nrt][1] = 0, sum[nrt] = 0, add[nrt] = 0;
        if (l == r) {
            sum[nrt] = a[l];
            return nrt;
        }
        int mid = (l + r) >> 1;
        ch[nrt][0] = build(l, mid), ch[nrt][1] = build(mid + 1, r);
        push_up(nrt);
        return nrt;
    }

    int update(int rt, int L, int R, int be, int en, int v) {
        int nrt = ++tot;
        ch[nrt][0] = ch[nrt][1] = 0, sum[nrt] = sum[rt], add[nrt] = add[rt];
        if (L <= be && en <= R) {
            sum[nrt] += 1ll * (min(R, en) - max(L, be) + 1) * v;
            add[nrt] += (ll) v;
            ch[nrt][0] = ch[rt][0], ch[nrt][1] = ch[rt][1];
            return nrt;
        }
        int mid = (be + en) >> 1;
        if (L <= mid) ch[nrt][0] = update(ch[rt][0], L, R, be, mid, v);
        else ch[nrt][0] = ch[rt][0];
        if (R > mid) ch[nrt][1] = update(ch[rt][1], L, R, mid + 1, en, v);
        else ch[nrt][1] = ch[rt][1];
          push_up(nrt);
        return nrt;
    }

    ll query(int rt, int L, int R, int be, int en) {
        if (L <= be && en <= R) return sum[rt];
        int mid = (be + en) >> 1;
        ll ans = 0;
        if (L <= mid) ans += query(ch[rt][0], L, R, be, mid);
        if (R > mid) ans += query(ch[rt][1], L, R, mid + 1, en);
        return ans + add[rt] * (min(R, en) - max(L, be) + 1);
    }
} tree;

乍一看感觉非常正确,事实上非常不正确!

样例:

8 4
1 2 3 4 5 6 7 8
C 1 8 1
Q 1 8
C 3 4 1
Q 1 8

因为在push_up的时候错误地更新了信息。导致最终答案错误。

2020/10/29 19:27
加载中...