1 条题解

  • 0
    @ 2026-9-3 10:29:11

    题解

    思路

    设 dpidp_i 为前 ii 个元素的合法划分数,dp0=1dp_0=1。若子段 (j,i](j,i] 中恰好出现一次的值不超过 kk,则 dpjdp_j 可以转移到 dpidp_i。

    做法

    子任务 1:枚举切分

    枚举 n−1n-1 个间隙是否切开,逐段统计频率并验证。复杂度 O(2nn2)O(2^n n^2)。

    子任务 2:二次动态规划

    固定右端点 ii,从 ii 向左移动左端点,维护每个值的出现次数和恰好出现一次的值数,即可在 O(n)O(n) 内求出 dpidp_i。总复杂度 O(n2)O(n^2)。

    子任务 3:分块优化

    扫描右端点 ii。对每个候选切点 jj,维护 cjc_j,表示 (j,i](j,i] 中恰好出现一次的值数,同时在位置 jj 存放权值 dpjdp_j。需要查询所有 cj≤kc_j\le k 的权值和。

    设 aia_i 上一次、上上次出现位置为 p1,p2p_1,p_2。加入 aia_i 后:

    • j∈[p2,p1−1]j\in[p_2,p_1-1] 时,出现次数由一变二,cjc_j 减一;
    • j∈[p1,i−1]j\in[p_1,i-1] 时,出现次数由零变一,cjc_j 加一。

    于是每步只有两次区间加减一、一次全局查询和一次插入。

    对切点分块。每块维护懒标记、按块内原始 cc 值分桶的 dpdp 权值和,以及当前 c≤kc\le k 的权值和。整块加减一只移动一次阈值;散块修改先下放标记,再用 O(B)O(B) 重建。取块长 B≈nB\approx\sqrt n,单步复杂度为 O(B+n/B)O(B+n/B)。

    复杂度

    满分算法时间复杂度 O(nn)O(n\sqrt n),空间复杂度 O(nn)O(n\sqrt n);实际分桶总容量为块数乘 O(n)O(n)。

    • 1

    信息

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