1 条题解

  • 0
    @ 2026-9-3 10:43:30

    科尔涅耶维奇与异或(困难版)题解

    思路

    对每个异或值 zz,维护产生 zz 的严格递增子序列中最小的末尾元素 lastzlast_z。空子序列令 last0=−1last_0=-1。读到值 vv 时,所有满足 lastz<vlast_z<v 的状态都可转移到 zxorvz\mathbin{\mathtt{xor}}v,并把新状态末尾更新为 vv。

    做法

    子任务 1 枚举全部子序列并检查严格递增。

    子任务 2 对每个输入元素扫描全部 81928192 个异或状态,复杂度 O(8192n)O(8192n)。

    满分算法利用 0≤v≤50000\le v\le5000。当某个 lastzlast_z 从旧值降到新值时,状态 zz 只会新获得阈值 v∈(new,old]v\in(new,old] 的转移资格,把 zz 加入这些值的待处理表。输入出现 vv 时只处理尚未为该 vv 使用过的状态。每个二元组 (v,z)(v,z) 最多处理一次。

    正确性证明

    若存在异或为 zz、末尾小于 vv 的递增子序列,则追加当前 vv 后得到异或 zxorvz\mathbin{\mathtt{xor}}v 的合法子序列;反之任何以当前 vv 结尾的合法子序列删去末项后必来自这样的状态。只保留最小末尾不会损失任何后续转移。待处理表恰在最小末尾首次低于阈值时加入状态,且每个阈值状态对只处理一次,因此优化与逐元素扫描完全等价。

    复杂度

    时间复杂度 O(n+5001×8192)O(n+5001\times8192),空间复杂度 O(5001×8192)O(5001\times8192)。

    • 1

    信息

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