CF1787E The Harmonization of XOR 题解
CF1787E The Harmonization of XOR
题目大意
给定 \(n\) 个数 \([1, 2, 3, \cdots, n]\) 和两个正整数 \(k\) 和 \(x\)。
将这些数分成恰好 \(k\) 组使得每组的异或和都是 \(x\)。
(\(1 \le k \le n \le 2 \cdot 10^5, 1 \le x \le 10^9\))。
题解
首先,我们知道,如果我们无法从 \(n\) 个数中提取出 \(k\) 个异或和为 \(x\) 的集合,那么一定无解。所以我们想要尽量多的取提取集合,让每一个集合里的数尽量少。所以我们可以将所以异或和为 \(x\) 的集合写成 \([a \oplus x, a]\)(\(a\) 为正整数)这种形式。
证明如下:
假设我们现在已经无法提取出 \([a \oplus x, a]\) 这种形式的集合。
我们令 \(p\) 为 \(x\) 在二进制下的最高位,且 \(1 \sim n\) 中有 \(q\) 个数第 \(p\) 位为 \(1\)。
我们可以得到,对于 \([a \oplus x, a]\) 这个形式的集合,\(a \oplus x\) 与 \(a\) 中只有一个数第 \(p\) 位为 \(1\)。如果在没有选择的数中,仍有数第 \(p\) 位为 \(1\),那么它与 \(x\) 的异或和也一定没有选择,并且它们可以组成 \([a \oplus x, a]\) 这个形式的集合。因为 \(a \oplus x\) 一定比 \(a\) 小,并且 \(a\) 与 \(a \oplus x\) 一一对应,不会有其他数选中 \(a \oplus x\)。
有了上面的结论,我们就可以先去枚举 \(a\),尝试提取出 \(k\) 个形式为 \([a \oplus x, a]\) 或 \([x]\) 的集合。如果 \(a\) 已经从一枚举到了 \(n\),但仍未提出来 \(k\) 组集合,那么显然无解。如果能够提出来,去考虑剩下的数的异或和是否等于零。如果等于零,可以放在任意一个集合中,不影响这个集合最终的异或和。如果不为零,那么一定无解,因为我们想要满足条件就一定无法选中所有的数。实现就很简单了。
代码
#include <bits/stdc++.h>
#define M 200005
using namespace std;
int T, n, k, x, cnt, tot;
bool vis[M];
pair<int, int> pa[M];
int main() {
ios::sync_with_stdio(0);
cin >> T;
for(int t = 1; t <= T; ++ t) {
cnt = 0;
tot = 0;
for(int i = 0; i <= n; ++ i)
vis[i] = 0;
cin >> n >> k >> x;
for(int i = 0; i <= n; ++ i) {
if(vis[i])
continue;
if((i ^ x) <= n) {
vis[i] = 1;
vis[x ^ i] = 1;
tot += (i == 0 ? 1 : 2);
pa[++ cnt] = {x ^ i, i};
if(cnt == k)
break;
}
}
if(cnt != k)
cout << "NO\n";
else {
int sum = 0;
for(int i = 0; i <= n; ++ i)
if(!vis[i])
sum ^= i;
if(sum == 0) {
cout << "YES\n";
for(int i = 1; i < k; ++ i) {
if(pa[i].second != 0)
cout << '2' << ' ' << pa[i].first << " " << pa[i].second << '\n';
else
cout << '1' << ' ' << pa[i].first << '\n';
}
int pos1 = pa[k].first, pos2 = pa[k].second;
cout << n - tot + (pos2 == 0 ? 1 : 2) << ' ';
for(int i = 1; i <= n; ++ i)
if(!vis[i] || i == pos1 || i == pos2)
cout << i << ' ';
cout << '\n';
}
else
cout << "NO\n";
}
}
}
CF1787E The Harmonization of XOR 题解的更多相关文章
- BZOJ2115:[WC2011]Xor——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2115 https://www.luogu.org/problemnew/show/P4151 这道 ...
- HDU3949:XOR——题解
http://acm.hdu.edu.cn/showproblem.php?pid=3949 求n个数的异或和第k小. 参考:https://blog.sengxian.com/algorithms/ ...
- HDU 3949 XOR [线性基|高斯消元]
目录 题目链接 题解 代码 题目链接 HDU 3949 XOR 题解 hdu3949XOR 搞死消元找到一组线性无关组 消出对角矩阵后 对于k二进制拆分 对于每列只有有一个1的,显然可以用k的二进制数 ...
- Codeforces Round #383 (Div. 2) B. Arpa’s obvious problem and Mehrdad’s terrible solution —— 异或
题目链接:http://codeforces.com/contest/742/problem/B B. Arpa's obvious problem and Mehrdad's terrible so ...
- BZOJ2337:[HNOI2011]XOR和路径——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 【第400篇题解纪念2016年10月28日】【28.10%】【codeforces 617E】XOR and Favorite Number
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- skkyk:题解 洛谷P2420 【让我们异或吧】lca+xor前缀和
刚学了LCA,写篇题解巩固一下 首先题目有误: (A是否是男生 )xor( B是否是男生)=A和B是否能够成为情侣,这句话显然是错误的qwq 对于这道题,容易看出,对于待处理的两个点,只要我们找到他的 ...
- 题解-[WC2011]最大XOR和路径
[WC2011]最大XOR和路径 给一个 \(n\) 个点 \(m\) 条边(权值为 \(d_i\))的无向有权图,可能有重边和子环.可以多次经过一条边,求 \(1\to n\) 的路径的最大边权异或 ...
- Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)
Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...
- 【题解】 bzoj2115: [Wc2011] Xor (线性基+dfs)
bzoj2115,戳我戳我 Solution: 看得题解(逃,我太菜了,想不出这种做法 那么丢个链接 Attention: 板子别写错了 又写错了这次 \(long long\)是左移63位,多了会溢 ...
随机推荐
- 2021-03-20:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量。
2021-03-20:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量. 福大大 答案2021-03-20: 按行遍历二维数组,构造直方图. 单调栈,大压小.有代码. ...
- 2021-06-23:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛。一局比赛只有两个人,返回最多可以同时有多少场比赛。
2021-06-23:给定一个数组arr,代表每个人的能力值.再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛.一局比赛只有两个人,返回最多可以同时有多少场比赛. 福大大 答案20 ...
- Cobalt Strike 连接启动教程,制作图片🐎(2)
扫描有两种方式:arp 和 icmp 查看进程列表 攻击----生成后门-----Payload 可以生成各类语言免杀牧马---(输出:选择C或者python或者php) go.咕.com 生成c语言 ...
- ODOO前端引用css如何修改页面属性
odoo前端存在一些样式不合理的地方,如何通过ccs修改页面属性: 1 通过页面属性class: 2 新建模块后,创建static/src/css/styles.css文件 3 style.cs ...
- 在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控件实现产品列表信息的展示和选择
有时候,我们为了方便,我们往往使用扩展函数的代码方式创建很多GridView的操作功能,如在随笔<在DevExpress中使用BandedGridView表格实现多行表头的处理>中介绍过多 ...
- 一种实现Spring动态数据源切换的方法
1 目标 不在现有查询代码逻辑上做任何改动,实现dao维度的数据源切换(即表维度) 2 使用场景 节约bdp的集群资源.接入新的宽表时,通常uat验证后就会停止集群释放资源,在对应的查询服务器uat环 ...
- Python运维开发之路《高阶函数》
一.列表生成式,迭代器&生成器 列表生成式 需求:data列表里有如下三个值,需要给每个值加1 1 data = [1,2,3] 2 list = map(lambda x:x+1,data) ...
- PostgreSQL 12 文档: 部分 III. 服务器管理
部分 III. 服务器管理 这部份覆盖了PostgreSQL数据库管理员感兴趣的主题.包括软件安装.搭建和配置一个服务器.管理用户和数据库以及维护任务.任何想要运行一个PostgreSQL服务器的人( ...
- 吴恩达优化算法 (Optimization algorithms)笔记
Mini-batch 梯度下降(Mini-batch gradient descent) 使用batch梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用mini-batch梯度下降法,一次遍历训 ...
- 相较于Scrum, 我更推崇精益Kanban,帮助团队建立价值交付流,识别瓶颈问题
最近在学习实践精益Kanban方法,结合自己团队实践Srum的经历,整理些资料二者的差异.相较于Scrum, 我更推崇精益Kaban. Agile是一套理论和原则,就像天边的北极星.Devops是一种 ...