1 条题解

  • 0
    @ 2025-12-9 18:16:27

    题意重述

    我们有 nn 个车站 x1<x2<<xnx_1 < x_2 < \dots < x_n,可以放 kk 个标志(位置任意实数)。
    定义 c(i,j)c(i,j) 为:在 xix_ixjx_j 之间,离 xix_i 最近的标志到 xix_i 的距离,如果之间没有标志,则 c(i,j)=xixjc(i,j) = |x_i - x_j|
    目标是:

    minijc(i,j)\min \sum_{i \neq j} c(i,j)

    0k2000 \le k \le 200n10000n \le 10000xi107x_i \le 10^7


    第一步:化简 c(i,j)c(i,j)

    i<ji < j,即 xi<xjx_i < x_j

    rir_ixix_i 右侧第一个标志的位置(若没有则为 ++\infty)。
    那么:

    • rixjr_i \le x_j,则 c(i,j)=rixic(i,j) = r_i - x_i
    • ri>xjr_i > x_j,则 c(i,j)=xjxic(i,j) = x_j - x_i

    即:

    c(i,j)=min(rixi,xjxi)c(i,j) = \min(r_i - x_i, x_j - x_i)

    对于 i>ji > j 对称地定义 lil_ixix_i 左侧第一个标志位置(若没有则为 -\infty):

    c(i,j)=min(xili,xixj)c(i,j) = \min(x_i - l_i, x_i - x_j)

    第二步:拆分总和

    将总和按 ii 分组:

    $$S = \sum_{i=1}^n \left[ \sum_{j>i} c(i,j) + \sum_{j<i} c(i,j) \right] $$

    1. 对 j>ij > i 的部分

    rir_ixix_i 右侧第一个标志的位置。
    next(i)next(i) 是满足 xnext(i)rix_{next(i)} \ge r_i 的最小下标(若 ri>xnr_i > x_nnext(i)=n+1next(i)=n+1)。
    那么:

    • j<next(i)j < next(i) 时,c(i,j)=xjxic(i,j) = x_j - x_i
    • jnext(i)j \ge next(i) 时,c(i,j)=rixic(i,j) = r_i - x_i

    于是:

    $$\sum_{j>i} c(i,j) = \sum_{j=i+1}^{next(i)-1} (x_j - x_i) + (n - next(i) + 1) \cdot (r_i - x_i) $$

    2. 对 j<ij < i 的部分

    lil_ixix_i 左侧第一个标志的位置。
    prev(i)prev(i) 是满足 xprev(i)lix_{prev(i)} \le l_i 的最大下标(若 li<x1l_i < x_1prev(i)=0prev(i)=0)。
    那么:

    • j>prev(i)j > prev(i) 时,c(i,j)=xixjc(i,j) = x_i - x_j
    • jprev(i)j \le prev(i) 时,c(i,j)=xilic(i,j) = x_i - l_i

    于是:

    $$\sum_{j<i} c(i,j) = \sum_{j=prev(i)+1}^{i-1} (x_i - x_j) + prev(i) \cdot (x_i - l_i) $$

    第三步:标志位置的最优性

    因为 SS 关于标志位置是分段线性的,最优解中标志可以放在某个车站位置(或边界)而不损失最优性。
    因此我们只需考虑标志放在车站处的情况。


    第四步:动态规划设计

    dp[t][i]dp[t][i] 表示已经放了 tt 个标志,最后一个标志在车站 ii 时,前 ii 个车站相关的 SS 的最小值。

    但这样定义不方便计算完整的 SS,因为 c(i,j)c(i,j) 与后面的车站有关。
    我们换个角度:
    标志将数轴分成若干段,每段内(不含两端)的车站没有标志,这些车站的 rir_ilil_i 由两端标志决定。


    更清晰的 DP 状态

    dp[t][i]dp[t][i] 表示在前 ii 个车站中放了 tt 个标志(第 tt 个标志在车站 ii),且只考虑这些车站以及它们之间的贡献的最小代价。
    但是要小心处理“贡献”的定义,因为 c(i,j)c(i,j)jj 有关,即使 jjii 之后也可能与前面的标志相关。


    第五步:贡献计算重组

    我们可以将 SS 重新组合,使得 DP 容易计算。

    对于任意 ii

    $$\sum_{j \neq i} c(i,j) = \sum_{j>i} \min(r_i - x_i, x_j - x_i) + \sum_{j<i} \min(x_i - l_i, x_i - x_j) $$

    Ai=rixiA_i = r_i - x_iBi=xiliB_i = x_i - l_i
    注意 AiA_iii 到右侧第一个标志的距离,BiB_iii 到左侧第一个标志的距离。

    那么:

    $$\sum_{j>i} \min(A_i, x_j - x_i) = \sum_{j=i+1}^{next(i)-1} (x_j - x_i) + (n - next(i) + 1) \cdot A_i $$$$\sum_{j<i} \min(B_i, x_i - x_j) = \sum_{j=prev(i)+1}^{i-1} (x_i - x_j) + prev(i) \cdot B_i $$

    第六步:DP 方程推导

    如果我们设标志位置在车站集合 MM 中,那么对任意 ii

    • ii 是标志,则 Ai=0A_i = 0Bi=0B_i = 0,但实际上 ii 左右标志是自己?这里要小心,标志本身 c(i,j)c(i,j) 如何定义?若 ii 处有标志,那么离 ii 最近的标志就是 ii 自己(距离 0),所以 c(i,j)=0c(i,j) = 0 对任何 jj 成立?不对,题目说“离第 ii 个站最近的标记”,若标记就在 ii,距离为 0,所以 c(i,j)=0c(i,j) = 0。这意味着标志所在站对 SS 贡献为 0,这样显然标志应尽量覆盖多的车站以减少贡献。

    换个思路,直接建模:
    设我们在位置 y1<y2<<yky_1 < y_2 < \dots < y_k 放了标志。
    对车站 ii,设左右最近标志为 ylxiyry_l \le x_i \le y_r(可能重合)。

    • xi=ylx_i = y_l,则 Ai=yrxiA_i = y_r - x_iBi=0B_i = 0(左标志在自身)。
    • xi=yrx_i = y_r,则 Ai=0A_i = 0Bi=xiylB_i = x_i - y_l
    • yl<xi<yry_l < x_i < y_r,则 Ai=yrxiA_i = y_r - x_iBi=xiylB_i = x_i - y_l

    第七步:DP 方程简化

    因为标志在车站上,设标志下标为 p1<p2<<pkp_1 < p_2 < \dots < p_k
    对标志 ptp_tpt+1p_{t+1} 之间的车站 iipt<i<pt+1p_t < i < p_{t+1}),有:

    $$A_i = x_{p_{t+1}} - x_i, \quad B_i = x_i - x_{p_t} $$

    那么对 ii(pt,pt+1)(p_t, p_{t+1}) 中:

    $$\sum_{j>i} \min(A_i, x_j - x_i) + \sum_{j<i} \min(B_i, x_i - x_j) $$

    可以提前用前缀和预处理计算,记作 cost(pt,pt+1)cost(p_t, p_{t+1}) 表示区间 (pt,pt+1)(p_t, p_{t+1}) 内车站对 SS 的贡献总和(注意这里要考虑这些车站与所有 jj 的配对,不仅区间内)。

    仔细推导发现,cost(l,r)cost(l, r) 可以 O(1)O(1) 用前缀和计算,因为: 对于 i(l,r)i \in (l, r)Ai=xrxiA_i = x_r - x_iBi=xixlB_i = x_i - x_l

    那么:

    $$\sum_{j>i} \min(A_i, x_j - x_i) = \sum_{j=i+1}^{r-1} (x_j - x_i) + (n - r + 1) \cdot (x_r - x_i) $$$$\sum_{j<i} \min(B_i, x_i - x_j) = \sum_{j=l+1}^{i-1} (x_i - x_j) + l \cdot (x_i - x_l) $$

    这两个和式可以用 xx 的前缀和 prefpref 快速计算。


    第八步:最终 DP

    dp[t][i]dp[t][i] 表示已经放了 tt 个标志,最后一个标志在 ii,且考虑了前 ii 个车站相关贡献的最小值。
    转移时,枚举上一个标志位置 jj

    $$dp[t][i] = \min_{j < i} \{ dp[t-1][j] + cost(j, i) \} $$

    其中 cost(j,i)cost(j, i) 表示区间 (j,i)(j, i) 内车站(不包括 j,ij,i 端点)对 SS 的贡献总和(已经包含了它们与所有其他站的 c(p,q)c(p,q) 贡献)。
    计算 cost(j,i)cost(j,i) 需要 O(1)O(1) 公式,用前缀和预处理。


    第九步:复杂度优化

    直接 DP 复杂度 O(kn2)O(k n^2) 太大。
    观察到 cost(j,i)cost(j,i) 满足四边形不等式,决策单调性成立,因此可以用分治优化或单调队列优化到 O(knlogn)O(k n \log n)O(kn)O(k n)

    这里 n10000n \le 10000k200k \le 200O(knlogn)O(k n \log n) 可过。


    第十步:边界处理

    • 第一个标志之前和最后一个标志之后的区间需要特殊处理,可以将虚拟标志放在 -\infty++\infty 处。
    • 注意标志位置在车站上,cost(j,i)cost(j,i)j,ij,i 是标志下标,区间 (j,i)(j,i) 内无标志。

    第十一步:预处理公式

    pref[i]=a=1ixapref[i] = \sum_{a=1}^i x_asuf[i]=a=inxasuf[i] = \sum_{a=i}^n x_a

    l<rl < r,区间 (l,r)(l, r) 内车站 iiSS 的贡献:

    $$\text{right\_part}(i) = (pref[r-1] - pref[i]) - (r-1-i) \cdot x_i + (n - r + 1) \cdot (x_r - x_i) $$$$\text{left\_part}(i) = (i - l - 1) \cdot x_i - (pref[i-1] - pref[l]) + l \cdot (x_i - x_l) $$

    所以 $cost(l, r) = \sum_{i=l+1}^{r-1} [\text{right\_part}(i) + \text{left\_part}(i)]$。

    这个和可以进一步化简成关于 prefprefO(1)O(1) 公式,从而快速计算。


    第十二步:算法步骤

    1. 读入 n,k,xn,k,x
    2. 计算前缀和 prefpref
    3. 预处理 cost(l,r)cost(l,r)O(1)O(1) 计算方法。
    4. DP:dp[t][i]=minj<idp[t1][j]+cost(j,i)dp[t][i] = \min_{j < i} dp[t-1][j] + cost(j,i),用决策单调性优化。
    5. 最终答案 = minidp[k][i]+后缀区间代价\min_{i} dp[k][i] + \text{后缀区间代价}(即最后一个标志 iinn 的区间贡献)。

    第十三步:总结

    本题关键:

    1. c(i,j)c(i,j) 转化为最近标志距离。
    2. 重组总和为可 DP 形式。
    3. 预处理 cost(l,r)cost(l,r) 公式。
    4. 决策单调性优化 DP。

    • 1

    「是男人就过8题——Pony.ai」SignLocation

    信息

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