1 条题解

  • 0
    @ 2025-12-7 16:51:31

    题意解析

    Linda 想要确定一个“关键颜色差” CC,当且仅当相邻两次染色的颜色编号差的绝对值 C\ge C 时,Archie 才会注意到变化。

    她拥有编号 11NNNN 种发色,每种只能用一次。
    第一次染发的反应(与实验前发色相比)无意义
    从第二次染色开始,交互器会根据相邻两个颜色的 newprev|{\rm new} - {\rm prev}| 是否 C\ge C 返回 11(注意到)或 00(未注意到)。

    目标:在最多 6464 次询问内确定 CC 的值。
    NN 可大到 101810^{18}TT 最多 12001200 组。


    关键观察

    1. 第一个询问的返回值是无效的,但我们必须先输出一个颜色才能开始交互,这个返回值可忽略。
    2. 从第二次询问开始,返回值取决于当前颜色上一个颜色的差的绝对值 Δ\Delta
      • 如果 ΔC\Delta \ge C,返回 11
      • 如果 Δ<C\Delta < C,返回 00
    3. 每种颜色只能用一次,因此我们选择的颜色序列是 11NN 的一个排列。

    问题转换

    如果我们知道相邻两次颜色的差 Δ\Delta 以及返回值 rr,就可以得到关于 CC 的信息:

    • 如果 r=1r = 1,则 CΔC \le \Delta
    • 如果 r=0r = 0,则 C>ΔC > \Delta

    换句话说,每次有效的询问(从第二个颜色开始)都可以得到一个形如 CΔC \le \DeltaC>ΔC > \Delta 的条件。


    解题思路

    我们可以将 CC 的可能值区间初始设为 [1,N][1, N](实际上 CC 的取值范围是 11NN,但注意 CC 可以等于 NN,此时只有相邻颜色差 N\ge N 才会被注意到,而相邻颜色差最大为 N1N-1,所以除了第一次无效外,后面所有有效询问返回值都是 00)。

    考虑用二分法确定 CC 的值:

    我们需要构造相邻颜色的差 Δ\Delta 来测试 CC 是否小于等于某个值 mm

    假设上一个颜色是 prevprev,当前颜色是 nownow,则 Δ=nowprev\Delta = |now - prev|。如果我们想让 Δ\Delta 恰好等于某个我们想要测试的值 dd,就必须选择 now=prev±dnow = prev \pm d,且 1nowN1 \le now \le Nnownow 未被使用过。

    为了用二分法,我们需要测试 CmC \le m 是否成立。
    如果存在一个 dmd \ge m 且相邻染色时返回 11,则说明 CdC \le d 成立,进而 CmC \le m 成立(因为 mdm \le d)。
    如果我们用 d=md = m 测试并且返回 00,则 C>mC > m

    但是,直接测试 d=md = m 可能不方便,因为每次选择的颜色必须未使用过,且 nowprev=m|now - prev| = m 不一定可行(可能 now 已被使用或越界)。


    构造序列的策略

    一个经典构造是:从颜色 11 开始,然后跳到 1+m1 + m,再跳到 (1+m)(m1)=2(1 + m) - (m-1) = 2,再跳到 2+m2 + m,再跳到 33,如此往复。
    这样相邻差值在 mmm1m-1 之间交替。

    • 如果 CmC \le m,则差值为 mm 时会返回 11,差值为 m1m-1 时会返回 1100 取决于 CCm1m-1 的关系,但至少 mm 的这一步能测出 CmC \le m
    • 如果 C>mC > m,则差值为 mm 时也会返回 00

    所以通过一次 mm 的差值测试,就能二分。


    算法步骤

    1. 初始化 l=1,r=Nl = 1, r = NCC 的可能范围。
    2. 选择一个起始颜色 startstart(比如 11),输出第一个询问(返回值忽略)。
    3. l<rl < r 时:
      • 计算 mid=(l+r)/2mid = \lfloor (l + r) / 2 \rfloor
      • 构造相邻差值 midmid 的染色,即从当前颜色 pp 选择 p+midp+midpmidp-mid 中一个合法且未用过的颜色。
      • 输出这个颜色,得到返回值 respresp(从第二次开始有效)。
      • 如果 resp=1resp = 1,则 CmidC \le mid,令 r=midr = mid
      • 如果 resp=0resp = 0,则 C>midC > mid,令 l=mid+1l = mid + 1
    4. 最终 l=r=Cl = r = C,输出答案。

    询问次数分析

    每次二分将区间长度减半,区间长度从 NN 降到 11 需要 log2N\lceil \log_2 N \rceil 次有效询问。
    加上第一次无效询问,总询问次数为 log2N+1\lceil \log_2 N \rceil + 1
    N1018N \le 10^{18} 时,log2N60\log_2 N \le 60,因此最多 6161 次询问,满足 6464 次限制。


    注意事项

    • 每次选择的颜色必须未使用过,且范围在 [1,N][1, N] 内。构造差值时需确保合法。
    • 第一次询问的返回值无意义,但必须有一个“上一个颜色”才能开始有效比较,所以要先随便问一个颜色。
    • 每次输出后刷新缓冲区。
    • 多组数据,每组独立。

    示例流程(与题目样例一致)

    样例中 N=7N=7C=4C=4

    1. 问颜色 2(返回 1 但无效)。
    2. 问颜色 7,与 2 的差为 5,返回 1 → C5C \le 5
    3. 问颜色 4,与 7 的差为 3,返回 0 → C>3C > 3
    4. 问颜色 1,与 4 的差为 3,返回 0 → C>3C > 3(同条件)。
    5. 问颜色 5,与 1 的差为 4,返回 1 → C4C \le 4。 结合 C>3C > 3C4C \le 4C=4C=4

    总结

    本题是一个交互题,核心是通过构造相邻颜色差来二分查找 CC,利用返回值的比较结果不断缩小区间,直到确定 CC 的精确值。
    关键在于构造颜色序列,使得每次测试的差值可控,并且所有颜色不重复使用。
    询问次数控制在 O(logN)O(\log N) 内,足以应对 NN 极大的情况。

    • 1

    信息

    ID
    5312
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    16
    已通过
    1
    上传者