CF1872E Data Structures Fan

考查异或的基本性质。

对于操作2,用两个变量 X0,X1 记录 si=0/1 位置的异或和,在查询时直接输出即可。那么,在操作 1 如何更新 X0,X1

如果操作 1 只改变一个数,比如将 si0 改为 1,那么我们只需将 aiX0 中消除,并异或入 X1。如何消除?因为一个数和自身异或结果为 0,所以直接令 X0=X0ai 即可。不难发现,异或和“撤销异或”的操作是相同的,我们同时对 X1 的操作也是 X1=X1ai

现在操作 1 对一个区间取反,我们的操作变成 X0=X0(al++ar),X1=X1(al++ar),其中 (al++ar) 显然可以用前缀和维护,总复杂度为 O(q)

void solve() {
    int n;
    cin >> n;
    vector<int> a(n + 1), p(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        p[i] = p[i - 1] ^ a[i];
    }
    int x0 = 0, x1 = 0;
    string s; cin >> s;
    for (int i = 1; i <= n; i++) {
        if (s[i - 1] == '0') x0 ^= a[i];
        else x1 ^= a[i];
    }
    int q; cin >> q;
    while (q--) {
        int opt; cin >> opt;
        if (opt == 1) {
            int l, r; cin >> l >> r;
            x0 ^= p[r] ^ p[l - 1];
            x1 ^= p[r] ^ p[l - 1];
        } else {
            int g; cin >> g;
            cout << (g ? x1 : x0) << " ";
        }
    }
    cout << endl;
}
posted @   XYukari  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Apifox不支持离线,Apipost可以!
· 历时 8 年,我冲上开源榜前 8 了!
· 零经验选手,Compose 一天开发一款小游戏!
· Trae 开发工具与使用技巧
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示