← 返回题目页

T0915 霓虹灯带

标程

#include <bits/stdc++.h>
#include <string>
#include <vector>
using namespace std;

// 维护差分数组的前缀异或:单点修改、前缀查询都是 O(log n)
struct BIT {
    int n;
    vector<int> t;
    BIT(int n) : n(n), t(n + 1, 0) {}
    void add(int i, int v) {
        for (; i <= n; i += i & -i) t[i] ^= v;
    }
    int query(int i) {
        int r = 0;
        for (; i > 0; i -= i & -i) r ^= t[i];
        return r;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;
    string s;
    cin >> s;

    // 差分数组:翻转 [L,R] 等价于 d[L] 与 d[R+1] 各异或一次
    BIT bit(n);
    for (int i = 1; i <= n; ++i) {
        int cur = s[i - 1] - '0';
        int prev = i > 1 ? s[i - 2] - '0' : 0;
        if (cur ^ prev) bit.add(i, 1);
    }

    for (int i = 0; i < m; ++i) {
        int op;
        cin >> op;
        if (op == 1) {
            int l, r;
            cin >> l >> r;
            bit.add(l, 1);
            if (r + 1 <= n) bit.add(r + 1, 1);
        } else {
            int x;
            cin >> x;
            cout << bit.query(x) << "\n";
        }
    }
    return 0;
}

动画演示