1 条题解

  • 0
    @ 2026-8-30 10:57:28

    喂猫 题解

    思路

    设在时刻 xx 出现的猫数为 cxc_x,这些猫的出现区间左端点最小值为 pxp_x。如果在 xx 喂食,那么上一次喂食必须发生在 pxp_x 之前;否则至少有一只同时覆盖两个喂食时刻的猫会被喂两次。

    令 dpxdp_x 表示只考虑前 xx 个时刻时最多喂到的猫数。若不在 xx 喂食,答案为 dpx−1dp_{x-1};若在 xx 喂食,新增 cxc_x 只猫,之前只能使用 px−1p_x-1 及以前的决策。因此

    dpx=max⁡(dpx−1,dppx−1+cx).dp_x=\max(dp_{x-1},dp_{p_x-1}+c_x).

    没有猫出现的时刻不需要喂食。

    做法

    子任务 1 枚举全部喂食时刻集合,逐只猫统计被覆盖次数,保留每只猫至多被覆盖一次的方案。

    子任务 2 对每个时刻扫描全部区间,直接求 cxc_x 与 pxp_x,再按转移式计算 DP。

    完整做法用差分数组求所有 cxc_x。对相同左端点 ll,只需记录最大的右端点 maxR[l]:当扫描到 xx 时,从当前指针开始跳过所有 maxR[l] < x 的左端点,停下的位置恰好是仍覆盖 xx 的区间中最小的左端点。指针只增不减,因此这一部分是线性的。

    复杂度

    子任务 1 的时间复杂度为 O(2n(n+m))O(2^n(n+m))。子任务 2 的时间复杂度为 O(nm)O(nm)。完整做法每组的时间复杂度为 O(n+m)O(n+m),空间复杂度为 O(n)O(n)。

    • 1

    信息

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