1. 题目分析与解题思路
这道题目描述了一个有趣的场景:pigstd有n箱可乐,每箱可乐上标有一个正整数a_i。我们需要找到一个非负整数x(称为"聪明值"),使得满足(a_i⊕x)≤k的可乐箱数最大化。其中⊕表示按位异或运算。
1.1 问题转化
首先,我们需要理解题目要求的数学表达。对于每个a_i,我们希望找到一个x,使得a_i⊕x ≤ k。我们的目标是最大化满足这个条件的a_i的数量。
异或运算有一个重要性质:a⊕b = c ⇔ a⊕c = b。这意味着我们可以将条件重写为x ≤ a_i⊕k。但是这种转化并不能直接帮助我们,因为我们需要的是对所有a_i都适用的x。
1.2 关键观察
这道题的关键在于认识到:对于给定的k,我们可以为每个a_i确定一个x的范围,使得a_i⊕x ≤ k。然后,我们需要找到一个x值,使得它落在尽可能多的这些范围内。
具体来说,对于每个a_i,我们可以确定所有满足(a_i⊕x)≤k的x值。这些x值构成一个或多个区间。然后,我们需要找到一个x值,使得它被最多的区间覆盖。
1.3 算法选择
这个问题可以转化为一个经典的区间覆盖问题。我们可以:
- 对于每个a_i,计算所有满足(a_i⊕x)≤k的x值区间
- 使用差分数组技术来记录这些区间的覆盖情况
- 最后扫描整个范围,找到被最多区间覆盖的点
这种方法的时间复杂度主要取决于我们如何处理这些区间。由于a_i和k都可以达到1e6,我们需要一个高效的实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现解析
2.1 数据结构设计
代码中使用了几个关键的数据结构:
c[M*2]:这是一个差分数组,用于记录区间覆盖情况。大小设为2M是为了处理所有可能的x值。s1[50]和s2[50]:用于存储a_i和k的二进制表示。a[M]:存储输入的可乐数字。
2.2 核心函数f(b)分析
f(b)函数是算法的核心,它处理每个a_i,计算满足条件的x值区间:
- 将b(a_i)和k转换为二进制表示,存储在s1和s2数组中
- 对齐它们的长度,方便后续处理
- 从最高位开始逐位比较,构建满足条件的x值区间
函数中的关键部分是处理每一位时的逻辑:
- 如果k的当前位为0,则x的对应位必须与a_i的对应位相同
