1 条题解

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

    题解

    思路

    令一个点 (x,y)(x,y) 对应区间 [x,k−y][x,k-y]。三角形参数 (a,b)(a,b) 对应斜边区间 [a,k−b][a,k-b],其代价为区间长度乘 AA;该三角形能覆盖点,当且仅当点的区间完全包含在三角形区间中。

    若两个最优方案中的三角形区间相交,可以把它们合并,合并后的长度不大于原长度之和,且覆盖点只会增加。因此存在一个最优方案,其中三角形区间两两不交。

    先假设所有点均单独删除,总费用为 C=∑ciC=\sum c_i。使用区间 [L,R][L,R] 的三角形能获得的净节省为

    ∑xi≥L, k−yi≤Rci−A(R−L).\sum_{x_i\ge L,\ k-y_i\le R}c_i-A(R-L).

    问题变成选择若干不交区间,使总节省最大,最后答案为 CC 减去最大节省。

    做法

    子任务 1:枚举单位段集合

    把 [0,k][0,k] 分成 kk 个单位段。任意被选择的单位段集合可按连续块合并为若干三角形区间,总代价为选择单位段数乘 AA。点 (x,y)(x,y) 被三角形覆盖,当且仅当从 xx 到 k−y−1k-y-1 的所有单位段都被选择。

    枚举 2k2^k 个集合,直接计算三角形费用和未覆盖点的单删费用,取最小值。

    子任务 2:二次动态规划

    令 dpRdp_R 表示只考虑斜边坐标前缀 [0,R][0,R] 时的最大节省。若最后一个三角形为 [L,R][L,R],则由 dpLdp_L 转移。

    扫描右端点 R=1,2,…,kR=1,2,\ldots,k,对每个可能的左端点维护

    gL=dpL−A(R−L)+∑xi≥L, k−yi≤Rci.g_L=dp_L-A(R-L)+\sum_{x_i\ge L,\ k-y_i\le R}c_i.

    右端点增加一时,所有 L<RL<R 的 gLg_L 减去 AA;每个满足 k−yi=Rk-y_i=R 的点会给所有 L≤xiL\le x_i 的 gLg_L 加上 cic_i。然后

    dpR=max⁡(dpR−1,max⁡L<RgL).dp_R=\max(dp_{R-1},\max_{L<R}g_L).

    直接循环维护所有左端点即可得到 O(k2+nk)O(k^2+nk) 算法。

    子任务 3:区间加与全局最大值

    上述转移只需要:

    • 对前缀 [0,R−1][0,R-1] 加 −A-A;
    • 对前缀 [0,xi][0,x_i] 加 cic_i;
    • 查询全局最大值;
    • 在位置 RR 写入 dpRdp_R。

    用带懒标记的线段树维护这些操作。初始时位置 00 为零,其余位置为负无穷。扫描完所有 RR 后,答案为 C−dpkC-dp_k。

    复杂度

    三个层级的时间复杂度分别为 O(2k(n+k))O(2^k(n+k))、O(k2+nk)O(k^2+nk) 和 O((n+k)log⁡k)O((n+k)\log k);满分算法空间复杂度为 O(n+k)O(n+k)。

    • 1

    信息

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