1 条题解

  • 0
    @ 2026-8-24 13:10:47

    题解

    思路

    把一次方案分成若干段连续打卡区间。若最后一次休息在第 jj 天,那么第 j+1j+1 天到当前挑战日 xx 连续打卡,要求 xjkx-j\le k;挑战 (x,y,v)(x,y,v) 被满足当且仅当 j<xy+1j<x-y+1

    做法

    子任务 1

    枚举 nn 天的打卡集合,检查最长连续段和全部挑战,复杂度 O(2n(n+m))O(2^n(n+m))

    子任务 2

    dp[len] 表示处理到当前天、末尾连续打卡 len 天的最大能量。休息时转移到 len=0;打卡时从 len-1 转移并减去 dd,再加入当天所有 yileny_i\le len 的奖励。复杂度 O(nk+m)O(nk+m)

    满分算法

    在线段树中为可能的最后休息日 jj 维护

    $$F(j)=\text{休息到 }j\text{ 时的最优值}+dj+\text{此后已满足的挑战奖励}.$$

    处理挑战日 xx 前,先插入“第 xx 天休息”的状态。挑战 (x,y,v)(x,y,v) 的左端点为 l=xy+1l=x-y+1,它对所有 j<lj<l 的状态贡献 vv,因此做一次前缀区间加。当天连续打卡结束的最优值为

    maxxkj<xF(j)dx.\max_{x-k\le j<x}F(j)-dx.

    只需离散化 00、每个 xxx1x-1l1l-1max(0,xk)\max(0,x-k);其余日期没有挑战,休息状态的最优值不发生结构变化。

    复杂度

    • 子任务 1:O(2n(n+m))O(2^n(n+m))
    • 子任务 2:O(nk+m)O(nk+m),空间 O(k+m)O(k+m)
    • 满分算法:O(mlogm)O(m\log m),空间 O(m)O(m)

    易错点

    1. 挑战生效条件是 j<lj<l,线段树更新到 l1l-1
    2. 同一天先插入休息状态,再加入当天挑战;休息当天不能获得该挑战。
    3. 查询只允许 jxkj\ge x-k,否则连续打卡超过 kk 天。
    4. 答案至少为 00,因为可以一天也不打卡。
    • 1

    信息

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