1 条题解

  • 0
    @ 2026-9-3 11:12:06

    题解

    思路

    令 dpidp_i 表示已经使编号不超过 ii 的某棵树成为当前最大已砍倒编号,并为之后工作准备好时的最小代价。初始电量可直接砍倒高度为一的第一棵树,故 dp1=0dp_1=0。若下一个关键编号是 ii,此前最大编号为 j<ij<i,把第 ii 棵树锯 aia_i 次的充电贡献为 aibja_i b_j,所以

    dpi=min⁡j<i(dpj+bjai).dp_i=\min_{j<i}(dp_j+b_j a_i).

    做法

    每个 jj 对应直线 y=bjx+dpjy=b_jx+dp_j,需要按递增的 x=aix=a_i 查询最小值。斜率 bjb_j 严格递减,因此维护下凸包;查询点也递增,可以从队首单调弹出。中间分支在整数域 [1,105][1,10^5] 上使用 Li Chao 树;独立 Oracle 对所有实际 aia_i 离散化后使用 Li Chao 树。

    正确性证明

    转移枚举了最后一次把当前最大已砍倒编号从 jj 更新为 ii 的全部可能,费用恰为已有最优费用加 aia_i 次按 bjb_j 充电,故动态规划正确。凸包只删除在任何后续递增查询点都不可能成为最小值的直线,队首比较给出当前横坐标的最小值,因此优化不改变转移结果。

    复杂度

    单调凸包实现时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)。

    • 1

    信息

    ID
    1457
    时间
    2000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者