1 条题解

  • 0
    @ 2025-11-5 14:45:13

    关键观察

    连续移动机制:在激活格上可以连续移动,这相当于从某个停止格出发,经过一串激活格,最终停在另一个停止格。我们可以将这样的连续移动路径压缩为一条"大边"。

    回合制的影响:玩家按顺序 1,2,,K1,2,\dots,K 轮流行动。如果玩家1需要移动 mm 次,那么总步数至少为 (m1)×K+1(m-1) \times K + 1

    其他玩家的作用:其他玩家可能需要移动来"让路",为玩家1创造到达目标的条件。

    解法思路

    步骤1:构建压缩图 我们构建一个新图,其中节点是所有停止格加上玩家1的起点 X1X_1(如果 X1X_1 不是停止格)。

    对于每个节点 uu,我们进行BFS:

    如果 uu 是停止格,则从 uu 出发,只走激活格,记录能到达的所有停止格 vv 及步数

    如果 uu 是激活格,则从 uu 出发,找到最近的停止格

    这样我们得到一个新图 GG',边权表示从一个停止格到另一个停止格所需的最小步数。

    步骤2:计算玩家1的最少移动次数 在新图 GG' 上,我们从玩家1的起点 X1X_1 开始BFS,计算到达每个停止格 tt 所需的最少玩家1移动次数 dist[t]dist[t]

    这里需要注意:如果起点 X1X_1 是激活格,我们需要先找到离它最近的停止格作为实际起点。

    步骤3:计算总步数 对于目标 TT

    如果 TT 是停止格,玩家1移动次数 m=dist[T]m = dist[T]

    如果 TT 是激活格,找到离 TT 最近的停止格 ss,玩家1移动次数 m=dist[s]+d(s,T)m = dist[s] + d(s, T)

    总步数公式:total=(m1)×K+1+extratotal = (m - 1) \times K + 1 + extra

    其中 extraextra 是调整项,处理其他玩家初始位置可能阻塞路径的情况。

    步骤4:处理路径阻塞 如果玩家1的路径被其他玩家的初始位置阻塞,我们需要额外步数来让路。具体来说:

    对于路径上的每个关键点,如果被其他玩家占用,可能需要额外1步让该玩家移动

    可以通过预处理每个格子的"最早可用时间"来处理

    复杂度分析

    构建最近停止格:BFS,O(N+M)O(N + M)

    构建压缩图:对每个停止格进行BFS,最坏 O(N×(N+M))O(N \times (N + M)),但实际中由于图的稀疏性和停止格数量有限,可以接受

    计算最短路径:在压缩图上跑Dijkstra,O((N+E)logN)O((N + E)\log N),其中 EE 是压缩图的边数

    • 1

    信息

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