1 条题解

  • 0
    @ 2026-9-3 11:16:23

    题解

    思路

    把每个子数组看成带权集合,权值为区间和,要求选恰好 kk 个不同集合并覆盖全部位置。小规模可以直接枚举或按覆盖掩码做 0/1 DP;满分需要消去 kk 这一维。

    做法

    子任务 1

    列出全部子数组,递归枚举选或不选,并记录已选数、覆盖掩码与总权值。恰选 kk 个且掩码覆盖全部位置时更新答案。

    子任务 2

    令 dp[c][S]dp[c][S] 表示处理若干不同区间后,选了 cc 个、覆盖集合为 SS 的最大总和。每个区间进行一次倒序 0/1 背包转移,答案为 dp[k][2n−1]dp[k][2^n-1]。

    子任务 3

    使用 WQS 二分。给每个被选区间减去罚值 KK,先求覆盖全部位置时“调整后总和最大,若相同则区间数最多”的方案。随着 KK 增大,最优区间数单调不增;二分出仍能选择至少 kk 个区间的最大 KK,再把 kKkK 加回。

    固定 KK 后按右端点扫描。所有调整后权值非负的区间必选;状态只需记录当前最左未覆盖位置。按前缀和排序,用两个树状数组维护当前右端点下非负区间的数量与总贡献;用线段树维护不同最左未覆盖位置的最优二元组,以及减去前缀最小值后的最优二元组,从而完成区间加和区间最大值转移。

    复杂度

    三档算法时间复杂度分别为 O(2n(n+1)/2)O(2^{n(n+1)/2}) 的受限枚举、O(kn22n)O(kn^2 2^n)、O(nlog⁡2nlog⁡V)O(n\log^2 n\log V);满分算法空间复杂度为 O(n)O(n),其中 VV 为答案斜率范围。

    正确性说明

    前两档分别完整枚举全部区间子集和标准 0/1 集合背包,因此不会重复选区间,且只接受覆盖全集的状态。满分算法中,对固定罚值,选择方案的目标变为原总和减去 KK 乘区间数;线段树 DP 精确枚举最左未覆盖位置的保持与被覆盖两类转移,并贪心加入所有非负区间。二元组第二关键字保证同值时取更多区间,使最优区间数关于 KK 单调。WQS 二分取临界罚值后加回 kKkK,由离散凸性得到恰选 kk 个区间的最优原总和。

    • 1

    信息

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