1 条题解

  • 0
    @ 2025-10-28 16:08:04

    问题重述

    2N2N 只河狸排成一排,NN 只唱 A 声部,NN 只唱 B 声部。要将它们分成 KK 组(歌曲),每组需满足:

    1. 至少一只河狸
    2. A 声部数量 = B 声部数量
    3. 组内所有 A 声部河狸都在所有 B 声部河狸的右边

    只能通过交换相邻河狸来调整位置,求最少交换次数。


    关键观察

    1. 条件分析

    第三个条件「所有A都在所有B的右边」意味着:对于任意一组,其成员的排列形如:

    [一些B] [一些A]
    

    且 A 的数量 = B 的数量。

    2. 问题转化

    设最终分组为 KK 段,每段包含 2ti2t_i 只河狸(tit_i 对 A-B)。

    由于 A 的总数 = B 的总数 = NN,我们有:

    i=1Kti=N\sum_{i=1}^K t_i = N

    3. 位置约束

    考虑最终排列中 A 和 B 的分布:

    • ii 组需要 tit_i 个 A 和 tit_i 个 B
    • 所有组的 A 必须按组顺序排在对应组的 B 的右边

    这实际上要求最终的排列形如:

    [B...B A...A] [B...B A...A] ... [B...B A...A]
    

    其中第 ii 个块有 tit_i 个 B 和 tit_i 个 A。


    核心解法

    1. 最优结构

    关键结论:存在最优解,使得最终排列是:

    • t1t_1 个位置是第1组的 B
    • 接着 t1t_1 个位置是第1组的 A
    • 接着 t2t_2 个位置是第2组的 B
    • 接着 t2t_2 个位置是第2组的 A
    • ...
    • 最后 tKt_K 个位置是第K组的 A

    2. 代价计算

    设原序列中:

    • posA[i]posA[i] = 第 ii 个 A 的原始位置(从左到右编号 1..2N)
    • posB[i]posB[i] = 第 ii 个 B 的原始位置

    在最终排列中:

    • jj 组的 B 占据位置:2i=1j1ti+12\sum_{i=1}^{j-1} t_i + 12i=1j1ti+tj2\sum_{i=1}^{j-1} t_i + t_j
    • jj 组的 A 占据位置:2i=1j1ti+tj+12\sum_{i=1}^{j-1} t_i + t_j + 12i=1jti2\sum_{i=1}^{j} t_i

    交换次数 = 将每个河狸移动到目标位置的距离和。

    3. 问题简化为划分问题

    我们需要将 NN 个 A 和 NN 个 B 分成 KK 组,每组 tit_i 对,最小化总移动距离。

    设:

    • preA[i]preA[i] = 前 ii 个 A 的原始位置和
    • preB[i]preB[i] = 前 ii 个 B 的原始位置和

    对于给定的划分 0=p0<p1<<pK=N0 = p_0 < p_1 < \cdots < p_K = N,其中 pj=i=1jtip_j = \sum_{i=1}^j t_i,代价为:

    $$\sum_{j=1}^K \left[ \sum_{k=p_{j-1}+1}^{p_j} (2p_{j-1} + k - posB[k]) + \sum_{k=p_{j-1}+1}^{p_j} (2p_{j-1} + t_j + k - posA[k]) \right] $$

    化简后是关于 pjp_j 的二次函数,可以使用动态规划优化。


    算法框架

    1. 预处理

    1. 提取所有 A 和 B 的位置
    2. 计算前缀和 preA[i]preA[i], preB[i]preB[i]

    2. 动态规划

    dp[i][j]dp[i][j] = 将前 ii 对 A-B 分成 jj 组的最小代价。

    转移:

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

    其中 cost(l,r)cost(l, r) 是将第 ll 到第 rr 对 A-B 作为一组的代价。

    3. 代价函数

    经过推导,cost(l,r)cost(l, r) 可以写成:

    $$cost(l, r) = C + \alpha \cdot l + \beta \cdot r + \gamma \cdot l^2 + \delta \cdot r^2 + \epsilon \cdot lr $$

    的具体形式,满足决策单调性。

    4. 优化

    由于代价函数满足四边形不等式,可以使用分治优化将复杂度从 O(KN2)O(KN^2) 降到 O(KNlogN)O(KN \log N)

    对于 N106N \le 10^6 需要进一步观察性质:

    关键性质:最优解中 tit_i 的差异不超过 1,即 ti{N/K,N/K}t_i \in \{\lfloor N/K \rfloor, \lceil N/K \rceil\}


    最终算法

    1. 确定分组大小a=N/Ka = \lfloor N/K \rfloor, b=N/Kb = \lceil N/K \rceil

      • K1K_1 组大小为 aaK2K_2 组大小为 bb,满足 K1+K2=KK_1 + K_2 = K, K1a+K2b=NK_1a + K_2b = N
    2. 计算最小代价

      • 枚举 K1K_1K2K_2 的排列方式
      • 对于每种排列,直接计算总移动距离
    3. 输出最小代价


    复杂度分析

    • 确定分组O(1)O(1)
    • 计算代价O(N)O(N)
    • 总复杂度O(N)O(N),适合 N106N \le 10^6

    总结

    这道题的核心在于:

    1. 理解分组条件:A 必须在 B 的右边,且数量相等
    2. 发现最优结构:排列形如 [B...B A...A] 的连续块
    3. 代价计算:将问题转化为划分问题
    4. 优化决策:利用分组大小的均匀性降低复杂度

    通过分析问题的组合结构,我们将看似复杂的交换问题转化为简洁的数学优化问题。

    • 1

    信息

    ID
    4506
    时间
    6000ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    3
    已通过
    1
    上传者