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位,多了会溢 ...
随机推荐
- 用rust 写一个jar包 class冲突检测工具
Rust很适合写命令行工具,特别是使用clap crate 更加方便,这篇文章介绍使用rust写一个jar包class冲突检测的工具.项目地址: https://github.com/Aitozi/j ...
- 数学建模 Excel的批量写入与批量导出
数学建模中编程手们常常会被要求将大量的数据进行批量的预测操作,并写入某个文件中 Excel的批量导出数据,用循环就可以简单实现,例如 import pandas as pd for i in list ...
- 基于Quartz的可视化UI操作组件GZY.Quartz.MUI更新说明(附:在ABP中集成GZY.Quartz.MUI可视化操作组件)
前言 时隔2年.(PS:其实陆陆续续在优化,不过没发博客).. .本组件又迎来了新的更新... 很久没更新博客了.生了娃,换了工作单位,太忙了..实在抱歉 NET Core 基于Quartz的UI可视 ...
- hvv蓝初面试常见漏洞问题(上)
1.SQL注入 漏洞成因: 可控变量 变量会带入数据库查询 变量不存在过滤或者变量过滤不严格 注入流程 判断是否有注入点 order by 判断字段数量 union select 报错查看注入点 使用 ...
- java中单例模式 如何使用
引用: 原文链接:https://blog.csdn.net/qq_41458550/article/details/109243456
- Linux 中 3 个文件打包上传和下载相关命令详解
tar 命令 通过 SSH 访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar 命令就是必不可少的一个功能强大的工具.Linux 中最流行的tar是麻雀虽小,五脏俱全,功能强大. 使用t ...
- Galaxy Project 是一个由 NIH、NSF、Johns Hopkins University 等机构支持的开源生物医学开源项目。Galaxy 作为其中的一个子项目,提供了以英文为主,......
本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...
- 曲线艺术编程 coding curves 第五章 谐波图形(谐振图形) HARMONOGRAPHS
原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗(sheldon) blog: http:// ...
- Vue——登录小案例、scoped、ref属性、props其他、混入mixin、插件、Element-ui
解析Vue项目 # 1 为什么浏览器中访问某个地址,会显示某个页面组件 根组件:APP.vue 必须是 <template> <div id="app"> ...
- 【C++ Primer】2.1 基本内置类型
1. 基本内置类型 基本算数类型: 类型 含义 最小尺寸 bool 布尔类型 8bits char 字符 8bits wchar_t 宽字符 16bits char16_t Unicode字符 16b ...