1 条题解

  • 0
    @ 2026-11-2 13:11:11

    XOR 的艺术(Art of XOR) 题解

    思路分析

    按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。

    参考代码

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int n, m;
    string s;
    vector<int> sumT, flipT;
    
    void build(int u, int l, int r) {
        if (l == r) {
            sumT[u] = (s[l - 1] == '1');
            return;
        }
        int mid = (l + r) >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        sumT[u] = sumT[u << 1] + sumT[u << 1 | 1];
    }
    
    void apply(int u, int l, int r) {
        sumT[u] = (r - l + 1) - sumT[u];
        flipT[u] ^= 1;
    }
    
    void push(int u, int l, int r) {
        if (flipT[u]) {
            int mid = (l + r) >> 1;
            apply(u << 1, l, mid);
            apply(u << 1 | 1, mid + 1, r);
            flipT[u] = 0;
        }
    }
    
    void update(int u, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) {
            apply(u, l, r);
            return;
        }
        push(u, l, r);
        int mid = (l + r) >> 1;
        if (ql <= mid) update(u << 1, l, mid, ql, qr);
        if (qr > mid) update(u << 1 | 1, mid + 1, r, ql, qr);
        sumT[u] = sumT[u << 1] + sumT[u << 1 | 1];
    }
    
    int query(int u, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) return sumT[u];
        push(u, l, r);
        int mid = (l + r) >> 1;
        int res = 0;
        if (ql <= mid) res += query(u << 1, l, mid, ql, qr);
        if (qr > mid) res += query(u << 1 | 1, mid + 1, r, ql, qr);
        return res;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        if (!(cin >> n >> m >> s)) return 0;
        sumT.assign(4 * n + 5, 0);
        flipT.assign(4 * n + 5, 0);
        build(1, 1, n);
        for (int i = 0; i < m; ++i) {
            int op, l, r;
            cin >> op >> l >> r;
            if (op == 0) update(1, 1, n, l, r);
            else cout << query(1, 1, n, l, r) << "\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    8652
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者