首页 > 其他分享 >CF1787E The Harmonization of XOR 题解

CF1787E The Harmonization of XOR 题解

时间:2023-08-17 20:46:19浏览次数:37  
标签:std right XOR Harmonization 题解 valueType 满足要求 集合 left

题面

将集合 \(\left\{1, 2, \cdots, n\right\}\) 划分为 \(k\) 个非空不交子集,使得每个子集的异或和均为 \(x\)。

(\(1 \le n,k \le 2 \times 10^5\))。

题解

首先显而易见的判断一下无解的情况,记 \(sum = \bigoplus\limits_{i = 1}^{n} i\),如果 \(k\) 为奇数但 \(sum \neq x\) 或者 \(k\) 为偶数但 \(sum \neq 0\) 都一定无解,下文假定已经判断出这种情况。

可以发现任意三个满足要求的子集可以合并为满足要求的一个大集合,所以任务转化为最大化合法子集的数量。可以发现 \(\left\{a, a\oplus x\right\}\) 和 \(\left\{x\right\}\) 这两种集合显然是满足要求的,所以优先构造这两种集合,剩下的元素最后合并到这些集合中。

下面对这种构造方式最优进行证明,该种构造方式最优,当且仅当剩下的元素构成的集合 \(S\) 不能分裂成多个满足要求的集合。

设 \(x\) 在二进制表示下的最高位为 \(B\),如果 \(S\) 可以分裂成多个满足要求的集合,那么 \(S\) 中一定存在二进制下第 \(B\) 位为 \(1\) 的数,假定其为 \(p\)。因为 \(B\) 为 \(x\) 二进制表示下的最高位,所以 \(x\) 二进制下第 \(B\) 位一定为 \(1\)。进而可以得出 \(x \oplus p < p\),考虑 \(m = x \oplus p\) 是否会在其他集合构造时被使用,首先第一种集合 \(\left\{a, a\oplus x\right\}\),显然如果 \(m\) 在该集合中,那集合的另一个元素一定为 \(p\),与 \(p\) 未使用矛盾;考虑第二种情况 \(\left\{x\right\}\),因为 \(p > 0 \Rightarrow m \neq x\),矛盾。

因此在这种构造方式下,剩下的元素构成的集合 \(S\) 的异或和不可能为 \(x\),又考虑到最开始判出了总异或和不合法的情况,所以集合 \(S\) 的异或和一定为 \(0\),所以在最终求解时直接将 \(S\) 并入任意一个先前构造出的合法集合中。

Code

//Codeforces - 1787E
#include <bits/stdc++.h>

typedef long long valueType;
typedef std::vector<valueType> ValueVector;
typedef std::vector<ValueVector> ValueMatrix;

int main() {
    valueType T;

    std::cin >> T;

    for (int testcase = 0; testcase < T; ++testcase) {
        valueType N, K, X;

        std::cin >> N >> K >> X;

        valueType xorSum = 0;

        for (valueType i = 1; i <= N; ++i)
            xorSum ^= i;

        if (((K & 1) == 1 && xorSum != X) || ((K & 1) == 0 && xorSum != 0)) {
            std::cout << "NO" << '\n';

            continue;
        }

        ValueVector remain;
        ValueMatrix ans;

        for (valueType i = 1; i <= N; ++i) {
            if (i == X) {
                ans.emplace_back(1, i);
            } else if ((i ^ X) > N) {
                remain.emplace_back(i);
            } else if ((i ^ X) < i) {
                ans.push_back({i, i ^ X});
            }
        }

        if (ans.size() < K) {
            std::cout << "NO" << '\n';

            continue;
        }

        for (valueType i = K; i < ans.size(); ++i)
            ans[0].insert(ans[0].end(), ans[i].begin(), ans[i].end());

        ans[0].insert(ans[0].end(), remain.begin(), remain.end());

        std::cout << "YES" << '\n';

        for (valueType i = 0; i < K; ++i) {
            std::cout << ans[i].size() << ' ';

            for (auto const &value: ans[i])
                std::cout << value << ' ';

            std::cout << '\n';
        }
    }
}

标签:std,right,XOR,Harmonization,题解,valueType,满足要求,集合,left
From: https://www.cnblogs.com/User-Unauthorized/p/solution-CF1787E.html

相关文章

  • CF803C Maximal GCD 题解
    题意构造一个长度为\(k\),和为\(n\)的严格单调递增序列,并最大化其最大公约数。(\(1\len,k\le10^{10}\))题解首先可以发现一个事实,这个序列的最大公约数一定为\(n\)的因子。所以我们可以考虑枚举\(n\)的所有因子并判断其能否成为整个序列的最大公约数。假设我们现在枚......
  • 【题解】#373. 「USACO1.1」Friday the Thirteenth 题解(2023-07-19更新)
    #373.「USACO1.1」FridaytheThirteenth题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2背景这个蒟蒻又一次写了一篇大水题的题解(话说为什么是又),当然也是为了纪念他的\(......
  • 【题解】#68. 「NOIP2004」津津的储蓄计划 题解(2023-07-19更新)
    #68.「NOIP2004」津津的储蓄计划题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2背景这是这个蒟蒻的第一篇题解,也是这个蒟蒻对自己的\(50\)AC的纪念。Part3更新日志......
  • 算法题解之罗马数字智力游戏
    题目描述牛牛和朋友在玩耍时发现了一款关于罗马数字的智力游戏。在这个游戏中,他们首先需要将一个给定的整数num转换为对应的罗马数字。但是,他们发现,当他们每次转换后的结果字符串长度达到了一个阈值limit时,他们需要将字符串反转。请编写一个函数,将给定的整数num转换为对应的......
  • [JOISC 2014 Day3] 电压 题解
    题面给定\(n\)个点\(m\)条边的无向图。现在要对每个点黑白染色。若能够使一条边连接的两点颜色相同,其他边连接的两点颜色不同,则这条边合法。求合法的边数。$2\leqn\leq10^5,1\leqm\leq2\times10^5$。图可能不连通,不保证没有重边。题解首先考虑转化一下题目......
  • P3780 [SDOI2017] 苹果树 题解
    DescriptionP3780[SDOI2017]苹果树给定一棵\(n\)个点的树,每个点有若干个价值相同的苹果,儿子能摘至少一个仅当父亲被摘至少一个。给定\(k\),设\(h\)为你摘的苹果的最大深度,你做多能摘\(k+h\)个,求最大价值。对于所有数据,\(1\len\le5\times10^4\),\(1\lek\le5\time......
  • P4183 [USACO18JAN] Cow at Large P 题解
    题意分析我们首先想到,枚举贝茜在\(x\)点,枚举度数大于\(2\)的点为\(y\)。设\(x\)的度数为\(a\),\(y\)的度数为\(b\)。我们首先发现每个\(x\)点都有一个初始的贡献为\(a\)条通往叶子的路径。如果点\(y\)到最近的叶子节点的距离大于到\(x\)的点的距离(农夫不能在......
  • 安防监控视频汇聚平台EasyCVR视频平台调用iframe地址无法播放的问题解决方案
    安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝对接等功能。为了便于用户......
  • 安防监控视频汇聚平台EasyCVR视频平台调用iframe地址无法播放的问题解决方案
    安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝对接等功能。为了便于用户二......
  • vue项目在360浏览器兼容模式下SCRIPT1002: 语法错误以及“fetch”未定义问题解决
    使用360浏览器的兼容模式,vue项目页面空白,打开控制台,发现如下报错:SCRIPT1002:语法错误 解决方法如下:1、安装依赖npminstall--savecore-jsregenerator-runtime2、在main.js引入import'core-js/stable';import'regenerator-runtime/runtime';3、在babel.confi......