1 条题解

  • 0
    @ 2025-10-27 16:45:34

    题目分析

    1. 分层图结构

    题目给出的特殊条件是:

    $$\left\lfloor \frac{b}{k} \right\rfloor = 1 + \left\lfloor \frac{a}{k} \right\rfloor $$

    这意味着:

    • 所有边都是从某一层连向下一层,不会跨层或回退
    • 图是一个有向无环图 (DAG)
    • 节点可以按层划分:第 ii 层包含节点 [ik,(i+1)k1][i \cdot k, (i+1)\cdot k - 1](最后一层可能不满)

    2. 问题转化

    对于查询 (a,b)(a, b)

    • s=a/ks = \lfloor a/k \rfloort=b/kt = \lfloor b/k \rfloor
    • 如果 tst \le s,则输出 1-1(因为只能往高层走)
    • 否则,路径必须经过层 s,s+1,,ts, s+1, \dots, t,且每步只能到下一层

    3. 核心思路

    min-plus 矩阵乘法 表示层间最短路径:

    • 定义 MiM_i 为从层 ii 到层 i+1i+1k×kk \times k 最短路径矩阵
    • 从层 pp 到层 qq 的最短路径矩阵为:
    $$R = M_p \otimes M_{p+1} \otimes \dots \otimes M_{q-1} $$

    其中 \otimes 是 min-plus 矩阵乘法:

    $$(A \otimes B)[x][y] = \min_{z} (A[x][z] + B[z][y]) $$

    4. 倍增预处理

    直接对每个查询做矩阵连乘太慢,使用 Sparse Table 预处理:

    • st[j][i]\text{st}[j][i] 表示从层 ii 到层 i+2ji + 2^j 的合并矩阵
    • 预处理:
    st[0][i]=Mi\text{st}[0][i] = M_i $$\text{st}[j][i] = \text{st}[j-1][i] \otimes \text{st}[j-1][i + 2^{j-1}] $$
    • 查询时,将区间 [s,t)[s, t) 拆成 O(logL)O(\log L) 个矩阵相乘

    5. 复杂度分析

    • 层数 Lnk10000L \le \frac{n}{k} \le 10000
    • k5k \le 5,矩阵乘法 O(k3)125O(k^3) \le 125
    • 预处理 O(LlogLk3)O(L \log L \cdot k^3)1.75×1071.75 \times 10^7
    • 每个查询 O(logLk3)O(\log L \cdot k^3)17501750,总 1.75×1071.75 \times 10^7,可接受

    6. 算法流程

    1. 读入数据,构建每层的转移矩阵 MiM_i
    2. 用倍增法预处理 ST 表
    3. 对于每个查询 (a,b)(a,b)
      • 计算 s=a/ks = \lfloor a/k \rfloor, t=b/kt = \lfloor b/k \rfloor
      • 如果 tst \le s,输出 1-1
      • 否则用 ST 表合并 [s,t)[s, t) 区间的矩阵
      • 输出矩阵中对应位置的值

    • 1

    信息

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