1 条题解

  • 0
    @ 2026-8-4 23:08:10

    本题要在一张非常大的网格上寻找 k3k\le 3 个宝藏。一次询问 (x,y)(x,y) 会返回若干个方向;从 (x,y)(x,y) 沿其中某个方向出发,可以沿一条最短路到达某个最近的宝藏。主要困难在于:寻找一个宝藏时,其他宝藏可能给出误导性的方向。

    子任务 1

    只有一个宝藏时很简单。分别进行一次二分搜索,确定宝藏所在的列与行;事实上,这两个搜索甚至可以同时完成。

    子任务 2

    现在要在另一个宝藏的干扰下找出第一个宝藏 TT。同时搜索它的行和列可能被带偏,因此先确定列,再确定行。

    可以从任意位置开始,根据第一次询问返回的方向水平移动。不妨假设方向为向右。通过二分搜索找到某个含有宝藏的列:搜索一对相邻格子的分界,左边的格子含有向右的指示,而其右侧相邻格子不含该指示;后一格所在的列必然包含宝藏。随后,在这一列内用相同方法向上或向下移动。若向上搜索,就寻找这样一对相邻格子的分界:下面的格子含有向上的指示,而上面的相邻格子不含;后者一定是某个宝藏。

    找到第一个宝藏 TT 后,两条经过 TT 的对角线把平面分成右、左、上、下四个区域。我们分别在四个区域内搜索第二个宝藏 UU。例如,从 TT 出发沿同一行向右搜索。起初,一些格子会向左指向第一个宝藏;一旦指示发生变化,就说明已经接近第二个宝藏。可以按递增的二次幂长度进行倍增,确定发生变化的大致位置,再进行一次二分搜索,精确找出某个向上或向下指向第二个宝藏的格子。这样便确定了宝藏所在的列,再在该列内二分搜索其所在的行。

    需要特别处理两个宝藏位于同一行,以及两个宝藏恰为某个正方形的一对对角顶点等边界情况。

    子任务 3

    前面已经说明了如何找到第一个宝藏 TT;存在三个宝藏时,同样的策略依然适用。

    搜索第二个宝藏时,同一区域内可能有多个宝藏,例如它们都位于右侧。此前,我们从 TT 沿同一行搜索某个包含第二个宝藏的列;现在则希望更精确地找到最近的那个宝藏。令 BBTT 右侧最近的、返回方向不只有向左的格子。可以确定,另外两个宝藏之一位于以 BB 为中心的菱形边界上。先在 BB 右侧的同一行内二分搜索,找到某个包含第二个宝藏的列,再在该列内向上或向下二分搜索。

    假设找到了位于点 CC 的第二个宝藏,而且 CC 如预期那样位于这个菱形上。可以从 CC 出发,在上、下、右三个区域内用类似方法搜索第三个宝藏。

    否则,我们能够确定第三个点所在的一条线段,但实际却在更远的点 DD 找到了某个宝藏。此时可以从 DD 沿两个方向进行类似搜索,因为由 BB 确定的菱形边,与 DD 的区域划分至多相交于两个区域。最后一个宝藏的位置可以由两条线段的交点确定。

    还要注意 TTUU 位于同一条对角线的情况。此时,它们可能彼此都能被对方找到,却始终找不到第三个宝藏。

    上述方法至多使用 17logn17\log n 次询问,还可以进一步优化到至多 11logn11\log n 次。例如,结合最先找到的两个宝藏的相对方向,可以减少定位最后一个宝藏所需的二分搜索次数。一种优化方法是考虑第二个宝藏在网格四条边界上的投影。询问这些投影点后,可以迅速判断第三个宝藏位于哪个区域,或判断它是否与 UU 位于同一行或同一列。

    生成式人工智能辅助说明

    本文由 OpenAI Codex 根据用户提供的 CEOI 2026 第一日官方英文题解翻译、排版并统一数学公式格式;算法思路、论证与复杂度均来自原文,未另行生成新的解法。

    • 1

    信息

    ID
    12608
    时间
    8000ms
    内存
    300MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者