1 条题解
-
0
题意重述
Alice 心中想一个数 ,Bob 可以多次询问“ 是否在某个区间集合的某个区间内”(回答 yes/no)。
Alice 至多撒谎一次(即所有回答中最多有一个与真实情况不符)。Bob 已经提出了 个问题()并得到了 Alice 的回答(yes/no)。
已知在这些回答下,如果 Bob 继续问下去,一定能确定 。
问 Bob 最少还需要问几次(最优策略下)才能确定 。可达 ,所以不能直接枚举数字。
第一步:处理已有信息
设第 次询问的区间集合为 (若干不相交区间的并)。
对于某个 ,定义 当且仅当 在 的某个区间内(即询问的真值)。已知 Alice 的回答 ( 表示 yes, 表示 no)。
撒谎模型
若 是真正的数,设撒谎位置为 ( 表示没撒谎),则对于所有 ,,而对于 ,。
所以对于每个 ,计算 ,即与回答不同的询问下标集合。
可能的条件是 。
第二步:离散化
由于 极大,但 ,且每个询问的区间总数有限(题目未给每个询问区间数的上限,但 很小),我们可以把所有询问的区间端点收集起来(包括 和 ),排序去重,把 分成若干连续段(segment)。
每个段内的 在所有询问中的归属相同,即对所有 , 在段内是常数。假设得到 个段:,其中 ,。
段 的长度 (可能很大)。
第三步:计算每个段的可能状态
对段 ,计算 (段内所有 对应的 )。
然后与 比较,得到 。段 可能的撒谎模式:
-
若 :这段里的 可能没撒谎(),也可能撒谎在某个位置 且 (这是不可能的,因为撒谎时 必须与 不同)。所以不能在这段撒谎。
所以唯一可能是没撒谎,即模式 。 -
若 :设 ,那么这段里的 可能是:
- 没撒谎()但 ,这不可能(没撒谎时 必须全等于 ),所以排除没撒谎。
- 撒谎在位置 (),这时 是撒谎造成的,其余位置 正好符合。
所以唯一可能是撒谎在 ,即模式 。
-
若 :这段里的 不可能是答案(因为至少要改变两个回答才能匹配,但只允许改一个)。
因此,每个段 对应至多一个可能的撒谎模式 ,其中 ( 表示没撒谎, 表示在第 次询问撒谎)。
如果 ,则 不存在,段 无效。
第四步:构造候选集合
定义状态单元 表示可能的答案在段 且撒谎位置为 ( 表示没撒谎)。
每个单元有 个可能的 。整个候选集合 是这些单元的并集。
已知 Bob 继续问一定能确定 ,所以 至少包含一个单元。
第五步:新询问的设计与划分
Bob 要问一个新问题,也是“ 是否在某个区间集合内”,对应一个函数 ( 表示 yes, 表示 no)。
由于 在同一个段内时,它在所有过去和未来询问的真假值都相同(因为段按所有历史询问的端点划分,新区间端点可以加到划分中,但我们可以先逻辑考虑而不显式构造区间),我们可以先只考虑对每个段的 值。即,新询问等价于将 个段分成两类: 的段和 的段。
考虑撒谎的影响
设真正答案是 ,Alice 的真实撒谎位置是 。
对于新询问(第 次):- 若 (没撒谎过):Alice 回答 。
- 若 (在新询问撒谎):Alice 回答 。
- 若 (已在历史某次撒谎过):Alice 不能再撒谎,回答 。
所以,对于候选单元 ,Bob 听到的回答取决于:
- 如果 :回答 。
- 如果 :回答 (因为不能再撒谎)。
- 如果 (我们引入这个表示在新询问撒谎):回答 。
实际上 不是一个预设的历史撒谎模式,但我们需要考虑新询问可能是撒谎的那一次。
因此我们要扩展状态:对每个段 ,如果 存在(即 ),那么可能的真实情况是:- :撒谎位置为 (如果 )或没撒谎()。
- :撒谎发生在新询问,这就要求历史回答必须全匹配,即 。
所以只有 的段才可能有 这种可能。
第六步:问题转化为决策树优化
现在候选集合是若干单元 ,每个 且满足上述规则。
每个单元有权重 (可能的 个数)。一次新询问 (将段分成 0/1)会得到回答 。
$$\text{pred}(j,t,f) = \begin{cases} f(j), & t \neq m+1 \\ 1 - f(j), & t = m+1 \end{cases} $$
对于单元 ,预测的回答是:如果 ,则该单元在回答 后仍可能;否则排除。
因此,新询问 把候选单元集合划分成两个子集:预测回答 0 的和预测回答 1 的。
Bob 听到的回答 会保留对应的子集。目标:用最少的询问,使最终保留的单元只有一个且 (即段长为 1,确定唯一 )。
第七步:状态表示与 BFS
因为 (段数)不大(最多 ),,所以总单元数 不大(可能几十到几百)。
我们可以用一个 bitmask 表示当前可能单元集合,每个 bit 代表一个单元是否存在。
初始 mask 包含所有有效单元。BFS 状态:,其中 的 bit 数 = 单元总数。
转移:枚举所有可能的询问 (即枚举所有 种对段的划分? 可能达到几百,太大,但实际有效询问不必枚举所有划分,只需枚举由至多 个区间组成的询问,因为 Bob 的询问是由若干区间组成的,对应 是某些段置 1,其余 0,并且 1 的段在数轴上形成若干连续块)。更简单的做法:新区间端点只能选自现有段的端点,所以新区间划分段的方式是选择某些段置 1。但枚举 仍大,需要优化。
关键优化
其实对于决策树优化,我们只关心询问对当前 mask 的划分能力:即把 mask 中的单元按预测回答分成两部分,我们希望两部分尽可能均衡(最坏情况下取大的那部分最小化)。
最优询问是找到 使得 最小,其中 是预测回答 的单元的总权重( 和)。所以问题变成:对当前 mask,找 使得 最小,其中 $W_b = \sum_{(j,t)\in mask, \text{pred}(j,t,f)=b} len_j$。
这可以看成是带权重的二分问题。
第八步:求解步骤
- 离散化:收集所有历史询问的区间端点,排序去重,得到段 和长度 。
- 计算每个段的 和 ,确定有效单元 。
- 初始 mask:包含所有有效单元 (历史撒谎)和 (当 时)。
- BFS 决策树:
状态 ,权值 表示 mask 中单元的总可能 数(即 )。
若 且唯一单元对应段长度 ,则达到目标(深度 = 已用额外询问数)。
对每个状态,枚举所有可能的询问 (可以限制 是由至多 个区间组成, 小,因为 小,不需要太复杂询问),计算 ,取 最小化,然后转移到 (),深度 。 - 输出最小深度。
第九步:复杂度与可行性
- 段数 ,由于 ,每个询问区间数未知,但假设不大, 可能在几百。
- 单元数 。
- BFS 状态数 太大,不能直接存所有 mask,但可以用记忆化 + 剪枝,只访问可达状态,并且很多 mask 不可达(因为询问会按规律划分)。
- 实际实现可能用 DP 记录每个 集合的最少额外询问数,但也要处理最坏情况。
由于 很小,可能标准解法是直接枚举所有可能的未来询问划分(因为询问由区间组成,区间端点来自现有段端点,所以可能的 有限),然后递归搜索。
第十步:总结
本题核心:
- 利用端点离散化将 降到 段。
- 根据历史回答确定每个段可能的撒谎模式。
- 转化为带权决策树问题,用 BFS/DP 求最优询问策略。
- 需要处理“新询问可能是撒谎的那一次”的情况,扩展状态空间。
-
- 1
信息
- ID
- 5937
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者