X or What?

符号约定:

  • $\xor$ 表示异或。
  • popcount($x$) 表示非负整数 $x$ 的二进制表示里数字 1 出现的次数。例如,$13 = 1101_2$,则 popcount(13) = 4。

注意到,popcount($a \xor b$) = popcount($a$) + popcount($b$) - 2 * number of positions both $a$ and $b$ are set。
因此,popcount($a \xor b$) 的奇偶性 = (popcount($a$) + popcount($b$)) 的奇偶性。

区间 $[L, R]$ 的异或和的 popcount 为偶数 $\iff$ $L - 1, R$ 这两个前缀的异或和的 popcount 同奇偶。

分别考虑异或和的 popcount 为奇数的前缀、异或和的 popcount 为偶数的前缀。

改变 $A_p$ 对答案的影响:
若 $A_p$ 的 popcount 的奇偶性不变,则答案亦不变,否则 $p, p+1, \dots, n - 1$ 这些前缀的异或和的 popcount 的奇偶性翻转。

解法 1

用线段树维护前缀的异或和的 popcount 的奇偶性。
支持查询:

  • 异或和的 popcount 为偶数的前缀最后一次出现的位置。
  • 异或和的 popcount 为奇数的前缀第一次/最后一次出现的位置。
bool bit_even(int x) {return (__builtin_popcount(x) & 1) == 0;
}struct node {int n[2];int flipped;void flip() {swap(n[0], n[1]);flipped ^= 1;}
};
const int N = 100005;
node seg[4 * N];int sum[N];
void push_up(int i) {int l = i * 2, r = l + 1;for (int j = 0; j < 2; j++) {seg[i].n[j] = seg[l].n[j] + seg[r].n[j];}
}void build (int i, int l, int r) {seg[i].flipped = 0;if (l == r) {seg[i].n[0] = bit_even(sum[l]);seg[i].n[1] = 1 - seg[i].n[0];return;}int mid = (l + r) / 2;build(i * 2, l, mid);build(i * 2 + 1, mid + 1, r);push_up(i);
}void push_down(int i) {if (seg[i].flipped) {int l = i * 2, r = i * 2 + 1;seg[l].flip();seg[r].flip();seg[i].flipped = 0;}
}int find_first(int v, int i, int l, int r) {if (seg[i].n[v] == 0) return r + 1;if (l == r) return l;push_down(i);int mid = (l + r) / 2;int res = find_first(v, i * 2, l, mid);if (res <= mid) {return res;}return find_first(v, i * 2 + 1, mid + 1, r);
}int find_last(int v, int i, int l, int r) {if (seg[i].n[v] == 0) return l - 1;if (l == r) return l;push_down(i);int mid = (l + r) / 2;int res = find_last(v, i * 2 + 1, mid + 1, r);if (res > mid) {return res;}return find_last(v, i * 2, l, mid);
}void flip(int i, int l, int r, int ql, int qr) {if (ql > r || qr < l) return;if (ql <= l && r <= qr) {seg[i].flip();return;}int mid = (l + r) / 2;push_down(i);flip(i * 2, l, mid, ql, qr);flip(i * 2 + 1, mid + 1, r, ql, qr);push_up(i);
}int main() {
#ifdef LOCALifstream in("main.in");cin.rdbuf(in.rdbuf());
#endifint T; cin >> T;for (int cas = 1; cas <= T; ++cas) {cout << "Case #" << cas << ":";int n, q; cin >> n >> q;vector<int> a(n + 1);for (int i = 1; i <= n; i++) {cin >> a[i];sum[i] = sum[i - 1] ^ a[i];}build(1, 1, n);while (q--) {int p, v;cin >> p >> v;++p;if (bit_even(v) != bit_even(a[p])) {flip(1, 1, n, p, n);}a[p] = v;cout << " " << max(find_last(0, 1, 1, n), find_last(1, 1, 1, n) - find_first(1, 1, 1, n));}cout << endl;}return 0;
}

转载于:https://www.cnblogs.com/Patt/p/11260053.html

Kick Start 2019 Round D相关推荐

  1. [CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)

    CodeJam 2019 Round 3 Rancake Pyramid problem solution code problem 神奈子是个很爱打麻将的老婆婆,有一天她把她的麻将放成了 nnn 堆 ...

  2. [Kick Start 2020] Round A 2.Plates

    [Kick Start 2020] Round A 2.Plates 1. 题目 Problem Dr. Patel has N stacks of plates. Each stack contai ...

  3. Round A - Kick Start 2019

    a.链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01/00000000000698d6 题意: ...

  4. 【COCI 2018/2019 Round #2】Kocka

    这道题也是一个ex的模拟题 不过他比Zamjena可爱 作为一个帅气的小哥哥,让我们一起, 开启你的模拟ex大门,C++从入门到放弃! 题目 题目描述 我又来了!我又来了! 在清晨来到儿童游乐园的时候 ...

  5. 【Kickstart】2019 Round A - Parcels

    解法 BFS+二分,首先通过BFS能遍历得到每个位置到最近的office的距离,同时也能得到最大值r 与些同时设置l=0,然后就开始对[l,r]进行二分查找 判断k是否可行的条件是:是否存在一个位置( ...

  6. Kick Start 2018 Round B - Problem A No Nine

    目录 一. 题目描述 1. 输入 2. 输出 3. Limits 二. 解题思路 1. 对于第一个条件的解决 2. 对于第二个条件的解决 2. 1 两个区间的划分 2. 2 对整组部分的处理 2. 3 ...

  7. 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc

    2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 by xzc,zx,lj 先 ...

  8. 【100题】第三十六 比赛淘汰问题(谷歌笔试)

    一,题目:(谷歌笔试) n支队伍比赛,分别编号为0,1,2--n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支.所以w[i ...

  9. Contention

    Google Kickstart 2019 Round A : Contention 问题 你正在给一个电影院售卖前排座位.假设前排座位有N个座位,从左到右编号1到N.你上个星期不在办公室,而现在回到 ...

最新文章

  1. linuxroot密码正确无法登录_敦煌网忘记登录密码怎么办?敦煌网登录密码找回办法...
  2. 如何让决策树中有样本的索引
  3. Unity3D之主菜单
  4. 免费开源、功能完善、暗黑风格,你会拒绝这款SSH工具吗?
  5. 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”
  6. touch: cannot touch /usr/local/tomcat/logs/catalina.out: Permission denied解决方法
  7. Scala基础 - _root_ package的作用
  8. 9款WordPress视频插件
  9. Wireshark 实用过滤表达式
  10. Selenium常见异常分析及解决方案
  11. Doris之资源管理
  12. 锐起无盘服务器蓝屏死机,正确配置减少锐起无盘系统死机蓝屏
  13. 三、判断三元一次方程组是否有解及求解——(计算糖果)
  14. 如何从 GitHub 上下载指定项目的单个文件或文件夹
  15. BZOJ 1069 最大土地面积(旋转卡壳求最大四边形)
  16. dax和m的区别_DAX:一文透彻理解DAX本质
  17. Java导出多个excel压缩成zip下载
  18. Eclipes配置代码模糊匹配(部分匹配)
  19. html简单的文字自动出现效果,8个华丽的HTML5文字动画特效赏析
  20. 一文读懂rawRGB、RGB和YUV数据格式与转换

热门文章

  1. PaddlePaddle训练营——公开课——AI核心技术掌握——第2章机器能“看”的现代技术——源自视觉神经原理的卷积网络简介及深入理解
  2. 【机器视觉】 gen_measure_arc算子
  3. 【嵌入式】Libmodbus源码分析(一)-类型和结构体
  4. 【Tools】XMind8安装教程详解
  5. java应用系统正确的连接DM主备集群
  6. vmware workstation pro 14 虚拟机无法开启、黑屏的解决方案汇总
  7. libevent源码学习-----阅读心得
  8. css expressionr,CSS Expression讲解
  9. Mac查看Android动态库依赖
  10. iOS Hacker Keychain相关The executable was signed with invalid entitlements