1 条题解
-
0
自动搬运
来自洛谷,原作者为

览遍千秋
将伤与泪汇成力化作拳搬运于
2025-08-24 22:55:42,当前版本为作者最后更新于2024-02-27 14:13:12,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
本题解为官方题解。
首先,证明一个结论:对于任意的 。都有 。
证明:假设 与 二进制表示中 与 不一样的最高位为第 位,由 可知 这一位为 , 这一位为 。由 可知 在高于第 位的每一个二进制位一定与 和 一样。若 的第 为为 ,则 与 二进制表示不一样的最高位低于第 位,即 。同理,如果 的第 位为 ,那么则有 。将两种情况总结即可得到 。
根据上面的结论即可得到,一个集合中任意两个正整数的异或的最小值一定出现在集合中大小关系上相邻的两个数之间。
于是,将集合 中所有元素从小到大排序得到数组 ,此问题则等价于将数组 划分为两个非空子序列 ,使得 中任意两个相邻元素的异或大于等于 ,且 中任意两个相邻元素的异或大于等于 的方案数。
考虑使用动态规划解决此问题:将数组 中每个正整数从前向后依次添加到数组 或数组 中。设 表示子序列 末尾元素为 ,且子序列 末尾元素为 时的方案数。当添加一个数组 中的元素到数组 或 中时,枚举所有的 并判断是否满足异或限制的条件进行转移。这样即可得到一个 的动态规划做法,但无法通过此题。
考虑优化上述动态规划做法:由于插入数组 中第 个正整数时,两个子序列 中一定刚好有一个子序列末尾为 。于是可以用一个 变量记录 中哪个子序列末尾为第 个元素,并记录另一个子序列末尾的位置,将时间复杂度优化到 。但仍然无法通过此题。
继续优化上述做法:对于数组 的末尾为数组 第 个数的情况,将数组 末尾所有可能的数和对应的方案数插入到一个字典树中。对于数组 的末尾为数组 第 个数的情况,将数组 末尾所有可能的数和对应的方案数插入到另一个字典树中。将数组 个数插入到 中的一个数组时,讨论 此时的位置在 哪个数组的末尾,分四种情况讨论转移。单次转移即为查询字典树中所有与 异或不超过 或 的数的总数。单次查询可以在 时间内做到。
总时间复杂度和空间复杂度均为 。
- 1
信息
- ID
- 9651
- 时间
- 1500ms
- 内存
- 1024MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者