1 条题解

  • 0
    @ 2026-9-3 10:53:10

    奇妙跳跃:题解

    思路

    令 dpidp_i 表示到达位置 ii 的最小费用,朴素转移为

    $$dp_i=\min_{j<i}\left(dp_j+\min_{j\le x\le i}a_x(i-j)^2\right).$$

    关键性质是:最优转移区间的最小值一定出现在某个端点。若最小值 aka_k 只出现在内部 j<k<ij<k<i,则拆成 j→k→ij\to k\to i 后费用变为

    ak((k−j)2+(i−k)2)<ak(i−j)2,a_k\big((k-j)^2+(i-k)^2\big)<a_k(i-j)^2,

    原转移不可能最优。

    做法

    取阈值 B=650B=650,分三类枚举端点最小值转移。

    1. 直接枚举距 ii 不超过 BB 的全部左端点,并向左维护区间最小值。
    2. 当右端点 ai≤Ba_i\le B 时,向左枚举到第一个 aj≤aia_j\le a_i。固定一个小值后,各次扫描区间互不重叠,总量为 O(nB)O(nB)。
    3. 维护一个栈,保存值严格递增且不超过 BB 的候选左端点。枚举栈中至多 BB 个位置,处理区间最小值出现在左端点的远距离转移。

    为什么可以忽略两端值都大于 BB 的远跳?逐格跳的费用至多为 n(i−j)n(i-j)。若一次长度为 dd 的跳跃最优,则

    Bd2<nd,B d^2<n d,

    从而 d<n/B≤Bd<n/B\le B;这种转移已经被第一类枚举。

    三类合并后覆盖全部可能的最优转移。

    复杂度

    时间复杂度为 O(nB)=O(nn)O(nB)=O(n\sqrt n),空间复杂度为 O(n)O(n)。

    子任务算法

    • n≤500n\le500:枚举所有 j<ij<i 并维护区间最小值,复杂度 O(n2)O(n^2)。
    • 所有 ai=ca_i=c:二次函数是凸的,拆成单位跳最优,故 dpi=c(i−1)dp_i=c(i-1)。
    • ai≤80a_i\le80:取 B=80B=80,只需小值端点扫描与单调候选栈,复杂度 O(80n)O(80n)。
    • 无限制:使用根号分治算法。
    • 1

    信息

    ID
    1346
    时间
    5000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者