不知道为什么自己开始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的时候错误地更新了信息。导致最终答案错误。