1 条题解

  • 0
    @ 2025-10-29 16:30:30

    问题分析

    题目描述了一个树形结构的河流网络(城市为节点,河流流向为父节点),其中城市1流向大海,其他城市流向某个祖先城市。暴雨会导致某城市及其所有下游城市(祖先节点)的河流暴增,下游城市可通过准备一条流入的河流(非暴增路径上的)避免损害。需实现两个函数:

    • init:初始化每个城市的初始准备(选择一条流入的河流或不准备)。
    • solve(x):暴雨前调整准备,确保x的所有下游城市安全,暴雨后恢复,且每次调用set不超过60次。

    核心思路

    1. 树结构特性:城市构成以1为根的树,每个节点的下游是其祖先(父节点、祖父节点等)。暴雨影响x的所有祖先,需确保这些祖先准备的河流不来自暴增路径(x→父(x)→...→1)。

    2. 重链剖分(HLD):将树划分为若干条“重链”(以重儿子为核心的连续节点),使任意路径的链数为O(log n),减少每次调整的节点数。

    3. 动态规划预处理:通过DP计算每个节点的最优初始准备策略(pol数组),最小化暴雨时的调整次数。pol表示节点的准备模式(如优先准备重儿子、轻儿子等)。

    4. 在线调整:暴雨前,沿x所在的重链向上调整所有祖先的准备,避开暴增路径;暴雨后恢复调整,确保下次暴雨的基础状态最优。

    详细步骤

    1. 树结构与重链剖分
    • 重儿子定义:子树规模最大的子节点(hson数组),通过dfs1计算。
    • 重链划分:每条重链由连续的重儿子组成,链的顶端为top数组,通过dfs2确定。重链剖分确保任意节点到根的路径仅经过O(log n)条链。
    2. 动态规划策略(dp函数)
    • 目标:为每个节点选择初始准备策略(pol),最小化暴雨时的调整成本(f[u])。
    • 策略分类(pol的1/2/3):
      • pol=1:优先准备重儿子,适合重链内节点,调整成本低。
      • pol=2/3:针对轻儿子或其他情况,平衡调整次数。
    • f[u]记录该节点的最小调整成本,确保整体策略的调整次数可控(f[1] ≤ 35)。
    3. 初始化(init函数)
    • 根据pol数组初始化每个城市的准备:若pol[u]=1,则初始准备重儿子(hson[u]),其他情况按策略初始化,确保初始状态最优。
    4. 暴雨处理(solve函数)
    • 暴雨前调整:沿x所在的重链向上遍历所有祖先节点,调整其准备为非暴增路径的河流(如轻儿子),确保下游安全。

    • 调用wait():确认暴雨前准备完成。

    • 暴雨后恢复:将调整的节点恢复到初始策略,为下次暴雨做准备。

    • 由于重链剖分的链数少(O(log n)),且每个链的调整次数固定,总set调用次数不超过60次。

    代码解析

    • dfs1:计算子树大小和重儿子,为剖分做准备。
    • dp:计算每个节点的最优策略(pol)和最小调整成本(f)。
    • dfs2:确定重链顶端(top),划分重链。
    • init:根据pol返回初始准备数组。
    • solve:暴雨前后沿重链调整和恢复准备,确保安全且set调用次数达标。

    复杂度分析

    • 预处理dfs1dpdfs2均为O(n),适合n≤5×10⁴。
    • 每次solve:沿重链遍历的节点数为O(log n),每个节点调整2次(最多),总set调用次数为O(log n),远小于60,满足q≤5×10⁵的需求。

    关键优势

    • 重链剖分减少了每次调整的节点数,确保效率。
    • 动态规划预处理优化了初始策略,最小化调整成本。
    • 在线调整与恢复机制平衡了当前安全与下次准备,符合题目约束。

    该方案通过树剖分与动态规划的结合,高效解决了暴雨时的准备调整问题,满足操作次数限制。

    • 1

    信息

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