求助!
查看原帖
求助!
560516
喵仔牛奶楼主2022/5/29 11:01

萌新第17个点挂了,与答案差了8!

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
ll n, m, opt, l, r, x, ak[N];
struct SegmentTree {
    ll add[N << 2], sum[N << 2], k;
    inline void getup(int rt) {
        sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
    }
    inline void build(int l, int r, int rt) {
        if (l == r) {
            sum[rt] = bool(ak[l] & 1 << k);
            return;
        }
        int mid = (l + r) >> 1;
        build(l, mid, rt << 1);
        build(mid + 1, r, rt << 1 | 1);
        getup(rt);
    }
    inline void pushdown(int rt, int len) {
        if (add[rt]) {
            add[rt << 1] ^= 1;
            add[rt << 1 | 1] ^= 1;
            sum[rt << 1] = (len - (len >> 1)) - sum[rt << 1];
            sum[rt << 1 | 1] = (len >> 1) - sum[rt << 1 | 1];
            add[rt] = 0;
        }
    }
    inline ll query(int L, int R, int l, int r, int rt) {
        if (l >= L && r <= R) return sum[rt];
        pushdown(rt, r - l + 1);
        int mid = (r + l) >> 1;
        ll tot = 0;
        if (L <= mid) tot += query(L, R, l, mid, rt << 1);
        if (mid + 1 <= R) tot += query(L, R, mid + 1, r, rt << 1 | 1);
        return tot;
    }
    inline void xor_change(int L, int R, int l, int r, int rt) {
        pushdown(rt, r - l + 1);
        if (l >= L && r <= R) {
            add[rt] ^= 1;
            sum[rt] = r - l + 1 - sum[rt];
            return;
        }
        int mid = (l + r) >> 1;
        if (L <= mid) xor_change(L, R, l, mid, rt << 1);
        if (mid + 1 <= R) xor_change(L, R, mid + 1, r, rt << 1 | 1);
        getup(rt);
    }
} bits[25];

int main() {
	cin >> n;
	for (int i = 1; i <= n; i ++)
		cin >> ak[i];
	for (int i = 0; i <= 22; i ++)
		bits[i].k = i, bits[i].build(1, n, 1);
	cin >> m;
	for (int i = 1; i <= m; i ++) {
		cin >> opt >> l >> r;
		if (opt == 1) {
			ll sum = 0;
			for (int j = 0; j <= 22; j ++)
				sum += bits[j].query(l, r, 1, n, 1) * (1 << j);
			cout << sum << '\n';
		} else {
			cin >> x;
			for (int j = 0; j <= 22; j ++)
				if (x & 1 << j) bits[j].xor_change(l, r, 1, n, 1);
		}
	}
	return 0;
}
2022/5/29 11:01
加载中...