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  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示