1 条题解
-
0
题意解析
Linda 想要确定一个“关键颜色差” ,当且仅当相邻两次染色的颜色编号差的绝对值 时,Archie 才会注意到变化。
她拥有编号 到 的 种发色,每种只能用一次。
第一次染发的反应(与实验前发色相比)无意义。
从第二次染色开始,交互器会根据相邻两个颜色的 是否 返回 (注意到)或 (未注意到)。目标:在最多 次询问内确定 的值。
可大到 , 最多 组。
关键观察
- 第一个询问的返回值是无效的,但我们必须先输出一个颜色才能开始交互,这个返回值可忽略。
- 从第二次询问开始,返回值取决于当前颜色与上一个颜色的差的绝对值 :
- 如果 ,返回 ;
- 如果 ,返回 。
- 每种颜色只能用一次,因此我们选择的颜色序列是 到 的一个排列。
问题转换
如果我们知道相邻两次颜色的差 以及返回值 ,就可以得到关于 的信息:
- 如果 ,则 ;
- 如果 ,则 。
换句话说,每次有效的询问(从第二个颜色开始)都可以得到一个形如 或 的条件。
解题思路
我们可以将 的可能值区间初始设为 (实际上 的取值范围是 到 ,但注意 可以等于 ,此时只有相邻颜色差 才会被注意到,而相邻颜色差最大为 ,所以除了第一次无效外,后面所有有效询问返回值都是 )。
考虑用二分法确定 的值:
我们需要构造相邻颜色的差 来测试 是否小于等于某个值 。
假设上一个颜色是 ,当前颜色是 ,则 。如果我们想让 恰好等于某个我们想要测试的值 ,就必须选择 ,且 且 未被使用过。
为了用二分法,我们需要测试 是否成立。
如果存在一个 且相邻染色时返回 ,则说明 成立,进而 成立(因为 )。
如果我们用 测试并且返回 ,则 。但是,直接测试 可能不方便,因为每次选择的颜色必须未使用过,且 不一定可行(可能 now 已被使用或越界)。
构造序列的策略
一个经典构造是:从颜色 开始,然后跳到 ,再跳到 ,再跳到 ,再跳到 ,如此往复。
这样相邻差值在 和 之间交替。- 如果 ,则差值为 时会返回 ,差值为 时会返回 或 取决于 和 的关系,但至少 的这一步能测出 。
- 如果 ,则差值为 时也会返回 。
所以通过一次 的差值测试,就能二分。
算法步骤
- 初始化 , 的可能范围。
- 选择一个起始颜色 (比如 ),输出第一个询问(返回值忽略)。
- 当 时:
- 计算 。
- 构造相邻差值 的染色,即从当前颜色 选择 或 中一个合法且未用过的颜色。
- 输出这个颜色,得到返回值 (从第二次开始有效)。
- 如果 ,则 ,令 。
- 如果 ,则 ,令 。
- 最终 ,输出答案。
询问次数分析
每次二分将区间长度减半,区间长度从 降到 需要 次有效询问。
加上第一次无效询问,总询问次数为 。
当 时,,因此最多 次询问,满足 次限制。
注意事项
- 每次选择的颜色必须未使用过,且范围在 内。构造差值时需确保合法。
- 第一次询问的返回值无意义,但必须有一个“上一个颜色”才能开始有效比较,所以要先随便问一个颜色。
- 每次输出后刷新缓冲区。
- 多组数据,每组独立。
示例流程(与题目样例一致)
样例中 ,:
- 问颜色 2(返回 1 但无效)。
- 问颜色 7,与 2 的差为 5,返回 1 → 。
- 问颜色 4,与 7 的差为 3,返回 0 → 。
- 问颜色 1,与 4 的差为 3,返回 0 → (同条件)。
- 问颜色 5,与 1 的差为 4,返回 1 → 。 结合 且 → 。
总结
本题是一个交互题,核心是通过构造相邻颜色差来二分查找 ,利用返回值的比较结果不断缩小区间,直到确定 的精确值。
关键在于构造颜色序列,使得每次测试的差值可控,并且所有颜色不重复使用。
询问次数控制在 内,足以应对 极大的情况。
- 1
信息
- ID
- 5312
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 16
- 已通过
- 1
- 上传者