1 条题解

  • 0
    @ 2026-8-28 1:27:06

    题解

    思路

    如果最终选择了数值 xx,那么同样等于 xx 的元素之间不会互相删除,因此应把所有 xx 都选完, 总贡献为 x⋅cxx\cdot c_x,其中 cxc_x 是 xx 的出现次数。另一方面,选择过 xx 后,数值 x−1x-1 与 x+1x+1 都不能再产生贡献。

    于是原问题等价于:在数轴上选择若干个互不相邻的数值 xx,使 ∑x⋅cx\sum x\cdot c_x 最大。这是带点权路径上的最大权独立集。

    做法

    令 fif_i 表示只考虑数值 1,2,…,i1,2,\ldots,i 时的最大得分。对数值 ii 有两种选择:

    • 不选 ii,得分为 fi−1f_{i-1};
    • 选 ii,则不能选 i−1i-1,得分为 fi−2+i⋅cif_{i-2}+i\cdot c_i。

    因此

    fi=max⁡(fi−1,fi−2+i⋅ci).f_i=\max(f_{i-1},f_{i-2}+i\cdot c_i).

    从小到大递推至最大输入值即可。答案可能达到 101010^{10},必须使用 64 位整数。

    子任务说明

    • 当 n≤20n\le20 时,可以枚举选中的元素子集,拒绝其中存在数值相差 11 的方案并取最大和, 时间复杂度为 O(2nn2)O(2^n n^2)。
    • 当任意两个不同输入值之差都不为 11 时,不同数值之间不会互相删除,选择全部元素就是最优, 直接求和即可。
    • 一般情形使用上述频次 DP。

    正确性证明

    先证明同一数值 xx 在最优方案中要么全选,要么全不选。选择一个 xx 只会删除数值为 x−1x-1 与 x+1x+1 的元素,不会删除其他 xx;因此一旦选择了 xx,继续选择剩余的所有 xx 只会增加得分而不会带来新的限制。

    考虑递推到数值 ii 的任意最优方案。若方案不选 ii,其得分至多为 fi−1f_{i-1},且该值可达。 若方案选择 ii,根据相邻冲突必不选择 i−1i-1;其余选择完全落在 11 到 i−2i-2 中,最优贡献 为 fi−2f_{i-2},再加上全部数值 ii 的贡献 i⋅cii\cdot c_i。两类方案覆盖所有可能性,取最大值得到 的恰是 fif_i。由归纳法,最终状态就是全局最优答案。

    复杂度

    设值域上界为 V=105V=10^5。时间复杂度为 O(n+V)O(n+V),空间复杂度为 O(V)O(V)。

    • 1

    信息

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