1 条题解

  • 0
    @ 2025-8-24 22:54:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar nullqtr_pwp
    我注意到有些人一直在做各种地方的cnoi题,但是并没有什么b用,可能是因为一直在舒适区里面舒服的卷,虐杀自己擅长的东西并获得成就感。

    搬运于2025-08-24 22:54:42,当前版本为作者最后更新于2024-06-19 15:55:46,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    考虑 m=0m=0 怎么做,即没有某些不等的限制。

    问题为:给定 nn 个数的数列 {ai}\lbrace a_i\rbrace,计数 bb 的数量使得:

    • 0biai0\leq b_i\leq a_i
    • i=1nbi=C\bigoplus_{i=1}^nb_i=C

    先给出结论,这个子问题的时间复杂度是 O(nlogV)O(n\log V)V=1018V=10^{18} 是值域。

    有异或和 =C=C 的很难处理。注意到 CC 为某个值与 C=0C=0 并无本质区别,直接转化成异或和为 00。考虑钦定 an+1=Ca_{n+1}=C,计算此时异或和为 00 的方案数 AA,再令 an+1=C1a_{n+1}=C-1,方案数为 BB,那么显然前 nn 个数异或和为 CC 的方案数为 ABA-B

    考虑异或和 =0=0 怎么做。对于一种特殊情况:a1>maxi=2naia_1>\max_{i=2}^n a_i 时,可以让 a2na_{2\sim n} 任意取,此时无论如何在更低位都可以找到一个 a1a_1 满足值的限制,使得异或和 =0=0,这种情况的方案数为 i=2n(ai+1)\prod_{i=2}^n (a_i+1)

    从这个方向进一步考虑,不妨设比第 dd 位高的部分的异或和为 00,那么考虑最低 dd 位能用以上方式调整的条件,让这个调整的位置是 ii,那么要求 bib_iaia_i 的比 dd 位高的部分并不完全重合,那么就要求 biai2d+1b_i\leq a_i-2^{d+1}

    枚举 d=logV0d=\log V\to 0。只考虑 dd 以及 dd 位以下的低位。设计 dp\text{dp} 为:fi,0/1,0/1f_{i,0/1,0/1} 表示前 ii 个数,是否有位置作为自由元,第 dd 位的异或和为 0/10/1 的贡献积。转移是容易的。

    这样可以在 O(nlogV)O(n\log V) 的时间解决这个子问题。


    考虑原问题怎么做,不难想到容斥。

    显然有一个对于边集 SS,钦定 SS 的边都不满足两端互不相等的做法,这样的复杂度是 O(2mnlogV)O(2^mn\log V),不能接受。

    注意到上述做法的细节:关注 SS 中的边构成的连通块,进一步地,大小为奇数的连通块只关注最小的 aia_i,大小为偶数的连通块直接乘上 (min(ai)+1)(\min(a_i)+1)

    所以我们可以简化成,连通块被划分成什么样子。

    考虑重新分配涉及的边集的容斥系数。(1)E(-1)^{|E|} 显然可以拆到每个连通块上求 (1)E(-1)^{|E'|} 的积。对于每个连通块,容斥系数即为:导出子图边集中所有使得此点集的连通的边集的,(1)E(-1)^{|E'|} 之和。可以 O(3nn)O(3^nn) 预处理这个,记录为 gSg_S,具体就是钦定一个部分与剩下的部分不连通,进行枚举子集。

    直接枚举点集划分是 O(Bell(n)nlogV)O(\text{Bell}(n)n\log V) 的,大概能过 n13n\leq 13


    事实上点集划分会导出,对于所有的 min(ai)\min(a_i) 且连通块为奇数的序列 cc,去跑最开始写的那个东西。不同的点集划分可能导出相同的 cc,这样非常浪费,加一个哈希表本质上无法优化复杂度。

    考虑枚举这个序列 cc,难点在于求它的容斥系数 coefccoef_c

    注意到 min(a)\min(a) 可以直接对于所有点按照 aa 排序,然后按序从 i=1ni=1\to n 进行连通块划分。dp\text{dp} 当前已经划分的点集的 coefScoef_S。每次枚举到 ii 时,1i11\sim i-1 必然已经划分完毕,对后面造成贡献的只有 ii。枚举 ii 的连通块 T{i,i+1,i+2,,n}T\subseteq\lbrace i,i+1,i+2,\cdots,n\rbraceiTi\in T,直接更新 coefcoef 即可。

    时间复杂度 O(3nn+2nnlogV)O(3^nn+2^nn\log V)

    提交记录。

    • 1

    信息

    ID
    9755
    时间
    4000ms
    内存
    1024MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者