Kick Start 2019 Round D
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相关推荐
- [CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)
CodeJam 2019 Round 3 Rancake Pyramid problem solution code problem 神奈子是个很爱打麻将的老婆婆,有一天她把她的麻将放成了 nnn 堆 ...
- [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 ...
- Round A - Kick Start 2019
a.链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01/00000000000698d6 题意: ...
- 【COCI 2018/2019 Round #2】Kocka
这道题也是一个ex的模拟题 不过他比Zamjena可爱 作为一个帅气的小哥哥,让我们一起, 开启你的模拟ex大门,C++从入门到放弃! 题目 题目描述 我又来了!我又来了! 在清晨来到儿童游乐园的时候 ...
- 【Kickstart】2019 Round A - Parcels
解法 BFS+二分,首先通过BFS能遍历得到每个位置到最近的office的距离,同时也能得到最大值r 与些同时设置l=0,然后就开始对[l,r]进行二分查找 判断k是否可行的条件是:是否存在一个位置( ...
- Kick Start 2018 Round B - Problem A No Nine
目录 一. 题目描述 1. 输入 2. 输出 3. Limits 二. 解题思路 1. 对于第一个条件的解决 2. 对于第二个条件的解决 2. 1 两个区间的划分 2. 2 对整组部分的处理 2. 3 ...
- 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc
2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 by xzc,zx,lj 先 ...
- 【100题】第三十六 比赛淘汰问题(谷歌笔试)
一,题目:(谷歌笔试) n支队伍比赛,分别编号为0,1,2--n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支.所以w[i ...
- Contention
Google Kickstart 2019 Round A : Contention 问题 你正在给一个电影院售卖前排座位.假设前排座位有N个座位,从左到右编号1到N.你上个星期不在办公室,而现在回到 ...
最新文章
- linuxroot密码正确无法登录_敦煌网忘记登录密码怎么办?敦煌网登录密码找回办法...
- 如何让决策树中有样本的索引
- Unity3D之主菜单
- 免费开源、功能完善、暗黑风格,你会拒绝这款SSH工具吗?
- 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”
- touch: cannot touch /usr/local/tomcat/logs/catalina.out: Permission denied解决方法
- Scala基础 - _root_ package的作用
- 9款WordPress视频插件
- Wireshark 实用过滤表达式
- Selenium常见异常分析及解决方案
- Doris之资源管理
- 锐起无盘服务器蓝屏死机,正确配置减少锐起无盘系统死机蓝屏
- 三、判断三元一次方程组是否有解及求解——(计算糖果)
- 如何从 GitHub 上下载指定项目的单个文件或文件夹
- BZOJ 1069 最大土地面积(旋转卡壳求最大四边形)
- dax和m的区别_DAX:一文透彻理解DAX本质
- Java导出多个excel压缩成zip下载
- Eclipes配置代码模糊匹配(部分匹配)
- html简单的文字自动出现效果,8个华丽的HTML5文字动画特效赏析
- 一文读懂rawRGB、RGB和YUV数据格式与转换
热门文章
- PaddlePaddle训练营——公开课——AI核心技术掌握——第2章机器能“看”的现代技术——源自视觉神经原理的卷积网络简介及深入理解
- 【机器视觉】 gen_measure_arc算子
- 【嵌入式】Libmodbus源码分析(一)-类型和结构体
- 【Tools】XMind8安装教程详解
- java应用系统正确的连接DM主备集群
- vmware workstation pro 14 虚拟机无法开启、黑屏的解决方案汇总
- libevent源码学习-----阅读心得
- css expressionr,CSS Expression讲解
- Mac查看Android动态库依赖
- iOS Hacker Keychain相关The executable was signed with invalid entitlements