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 题解的更多相关文章

  1. BZOJ2115:[WC2011]Xor——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2115 https://www.luogu.org/problemnew/show/P4151 这道 ...

  2. HDU3949:XOR——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=3949 求n个数的异或和第k小. 参考:https://blog.sengxian.com/algorithms/ ...

  3. HDU 3949 XOR [线性基|高斯消元]

    目录 题目链接 题解 代码 题目链接 HDU 3949 XOR 题解 hdu3949XOR 搞死消元找到一组线性无关组 消出对角矩阵后 对于k二进制拆分 对于每列只有有一个1的,显然可以用k的二进制数 ...

  4. 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 ...

  5. BZOJ2337:[HNOI2011]XOR和路径——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  6. 【第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 ...

  7. skkyk:题解 洛谷P2420 【让我们异或吧】lca+xor前缀和

    刚学了LCA,写篇题解巩固一下 首先题目有误: (A是否是男生 )xor( B是否是男生)=A和B是否能够成为情侣,这句话显然是错误的qwq 对于这道题,容易看出,对于待处理的两个点,只要我们找到他的 ...

  8. 题解-[WC2011]最大XOR和路径

    [WC2011]最大XOR和路径 给一个 \(n\) 个点 \(m\) 条边(权值为 \(d_i\))的无向有权图,可能有重边和子环.可以多次经过一条边,求 \(1\to n\) 的路径的最大边权异或 ...

  9. Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)

    Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...

  10. 【题解】 bzoj2115: [Wc2011] Xor (线性基+dfs)

    bzoj2115,戳我戳我 Solution: 看得题解(逃,我太菜了,想不出这种做法 那么丢个链接 Attention: 板子别写错了 又写错了这次 \(long long\)是左移63位,多了会溢 ...

随机推荐

  1. Django4全栈进阶之路21 项目实战(在线报修):创建App应用和Model模型

    创建应用App python manage.py startapp RepairApp 创建模型 在models.py文件中定义一个Repair模型来表示报修单,其中包含以下字段: repair_id ...

  2. django--循环调用的解决办法

    不要导入该APP的包,而是加上双引号写入"App.xxx"

  3. WPF入门教程系列二十六——DataGrid使用示例(3)

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...

  4. 每周更新 | Verilog测试用例及波形展示图功能上线

    Hi,亲爱的技术伙伴,经过产研团队的努力,本周ShowMeBug有以下4个功能上线啦- 芯片语言 Verilog 支持测试用例 芯片语言 Verilog 支持测试用例,自动评分同步上线- 同时,Ver ...

  5. 在树莓派上实现numpy的LSTM长短期记忆神经网络做图像分类,加载pytorch的模型参数,推理mnist手写数字识别

    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是LSTM识别mnist手写数字识别 训练代码在电脑上,cpu就能训练,很快的: import torch imp ...

  6. R 包 optparse 之命令行参数传递

    对于经常与 Linux 打交道的生物信息分析童鞋们,我们今天分享一下怎么在命令行下通过传递参数(类似perl.python) 的方式执行 R 脚本. 一般来说,命令行下使用 Rscript 执行 R ...

  7. WPF中登录接口

    通过获取文本将json字符串转化成对象并做好相应的匹配 步骤 获取相应的文本 json字符串转化对象 json转化成实体类 参考链接:https://www.sojson.com/json2cshar ...

  8. CANoe学习笔记(一):创建第一个仿真工程(基于CAN):点灯

    目录 内容: ①创建两个节点,Switch和Light节点 ②创建两个Panel界面 ③capl代码实现Switch控制Light亮灭 事先准备: 养成良好的习惯,将不同文件放入不同文件夹,创建如下几 ...

  9. LLE算法在自然语言处理中的应用:从文本到实体识别和关系抽取

    目录 文章介绍: 自然语言处理(Natural Language Processing,NLP)是人工智能领域的重要分支,它研究如何将人类语言转化为计算机可理解的格式.NLP的应用非常广泛,从语言翻译 ...

  10. 利用生成式预训练Transformer实现文本分类和命名实体识别

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4. 应用示例 ...