1 条题解

  • 0
    @ 2025-10-16 17:29:13

    解法思路

    核心思想:分类处理 + 树上差分

    根据油箱容量 kk 的大小采用不同的优化策略:

    • kk (k>Bk > B):路径上加油点稀疏,直接模拟
    • kk (kBk \leq B):路径上加油点密集,使用前缀和优化

    算法框架

    1. 预处理

    • LCA 预处理:使用倍增法预处理每个节点的 2i2^i 级祖先,用于快速求两点间路径
    • DFS 序与深度:记录每个节点的深度信息

    2. 大 kk 处理 (k>Bk > B)

    • 从路径起点和终点分别向 LCA 方向模拟跳跃
    • 每次跳跃 kk 条边,累加经过节点的加油成本
    • 使用 DFS 栈记录路径,快速找到 kk 级祖先

    3. 小 kk 处理 (kBk \leq B)

    • 对每个 kk 值单独处理
    • 在 DFS 过程中维护前缀和数组 sum[x],记录从根节点到 xx 路径上每隔 kk 个节点的成本之和
    • 利用前缀和快速计算任意路径上的加油成本

    关键技巧

    1. LCA 优化O(logn)O(\log n) 时间求任意两点最近公共祖先
    2. 分类处理:设定阈值 B=200B = 200,平衡时间与空间复杂度
    3. 树上差分:对小 kk 使用前缀和技巧,O(1)O(1) 计算路径成本
    4. DFS 栈:记录当前 DFS 路径,快速访问 kk 级祖先

    复杂度分析

    • 时间复杂度O(nlogn+nB)O(n \log n + nB),其中 BB 为阈值
    • 空间复杂度O(nlogn+nB)O(n \log n + nB)
    • 1

    信息

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