1 条题解

  • 0
    @ 2026-9-3 11:04:47

    题解

    思路

    先把相邻且同色的夹克压缩成一个连续段。记压缩后共有 mm 段,第 ii 段颜色为 uiu_i、长度为 sis_i,移动整段的代价为 wi=siYw_i=s_iY。

    最优方案中,打包时总会取走栈顶极长同色段;移动时也只需考虑移动完整连续段。若只移动某段的一部分,则两栈顶部会同时出现同色夹克,直接打包原栈顶不会更差。

    定义 dp[l][r]dp[l][r] 为只处理连续段 l…rl\ldots r 的最小代价。可以直接用 XX 打包第 ll 段,再处理 [l+1,r][l+1,r];也可以把第 ll 段与后面若干个同色段合并打包。被选同色段之间的区间都是独立子问题。

    对固定的 ll,只看满足 uj=ulu_j=u_l 的位置。维护:

    • FjF_j:把从 ll 到 jj 选中的同色段按第一种移动方向合并时的最小代价;
    • GjG_j:按另一种移动方向合并时的最小代价。

    初值为 Fl=2wlF_l=2w_l、Gl=wlG_l=w_l。若上一个选中位置是 kk,则

    Fj=min⁡k{Fk+dp[k+1][j−1]+2wj},F_j=\min_k\{F_k+dp[k+1][j-1]+2w_j\}, Gj=min⁡k{Gk+dp[k+1][j−1]+wj}.G_j=\min_k\{G_k+dp[k+1][j-1]+w_j\}.

    选到 jj 后,合并这些段并打成一包的代价为

    min⁡(Fj−2wj,Gj)+X+dp[j+1][r].\min(F_j-2w_j,G_j)+X+dp[j+1][r].

    与直接打包第 ll 段的方案取最小即可。

    做法

    子任务 1 可把“左栈、右栈”的完整状态作为最短路节点,枚举两次移动和两次打包操作,用 Dijkstra 求空状态的最短距离。

    若 X≤YX\le Y,移动一件夹克的代价已经不小于直接打包一个栈顶连续段,任何合并节省的打包次数都不足以抵消移动代价,因此答案就是压缩后连续段数乘 XX。

    子任务 3 对每个区间 [l,r][l,r] 重新计算上述 F,GF,G,复杂度为 O(m4)O(m^4)。

    满分算法按 ll 从大到小预先计算所有同色位置间的 F,GF,G,再枚举右端点更新 dp[l][r]dp[l][r],把重复计算消除到 O(m3)O(m^3)。

    复杂度

    • 子任务 1 的状态数为指数级,适用于 N≤9N\le9。
    • 子任务 2 的时间复杂度为 O(N)O(N),空间复杂度为 O(1)O(1)(不计输入)。
    • 子任务 3 的时间复杂度为 O(N4)O(N^4),空间复杂度为 O(N2)O(N^2)。
    • 满分算法的时间复杂度为 O(N3)O(N^3),空间复杂度为 O(N2)O(N^2)。
    • 1

    信息

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