1 条题解

  • 0
    @ 2025-8-24 22:45:55

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Galex
    流汗黄豆

    搬运于2025-08-24 22:45:55,当前版本为作者最后更新于2023-02-22 21:02:43,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    先考虑简化所求答案:

    对与原序列的 m=n(n+1)2m=\large\frac{n(n+1)}2 个区间,设区间按位或的值为 o1,o2,,omo_1,o_2,\dots,o_m,对应的按位异或的值为 x1,x2,,xmx_1,x_2,\dots,x_m,则每个区间的 ff 值为 fi=oi+xi(i=1,2,,m)f_i=o_i+x_i\kern{3pt} (i=1,2,\dots,m),所求答案即为 f1,f2,,fmf_1,f_2,\dots,f_mmm 个数的方差的 m2m^2mod998244353\kern{1pt}\mathrm {mod}\kern{3pt} 998244353 的值。

    设这 mm 个数的平均数为 fˉ=1mi=1mfi\bar{f}=\frac{1}{m}\sum_{i=1}^{m}f_i,方差为 s2=1mi=1m(fifˉ)2s^2=\frac{1}{m}\sum_{i=1}^m(f_i-\bar{f})^2,考虑简化所求答案 m2s2m^2s^2

    $$\begin{aligned} &m^2s^2\\ &=m\sum_{i=1}^m(f_i-\bar f)^2\\ &=m\sum_{i=1}^m(f_i^2-2f_i\bar f+\bar f^2)\\ &=m\sum_{i=1}^mf_i^2-2m\bar f\sum_{i=1}^mf_i+m^2\bar f^2\\ &=m\sum_{i=1}^mf_i^2-2\times(\sum_{i=1}^mf_i)^2+(\sum_{i=1}^mf_i)^2\\ &=m\sum_{i=1}^mf_i^2-(\sum_{i=1}^mf_i)^2 \end{aligned} $$

    又由 fi=oi+xif_i=o_i+x_i,有:

    $$\begin{aligned} &m^2s^2\\ &=m\sum_{i=1}^mf_i^2-(\sum_{i=1}^mf_i)^2\\ &=m\sum_{i=1}^m(o_i+x_i)^2-(\sum_{i=1}^m(o_i+x_i))^2\\ &=m\times(\sum_{i=1}^m o_i^2+\sum_{i=1}^m 2o_ix_i+\sum_{i=1}^m x_i^2)-(\sum_{i=1}^m o_i+\sum_{i=1}^m x_i)^2 \end{aligned} $$

    所以答案可转化为求各个区间五部分和:

    $$A=\sum_{i=1}^m o_i^2\quad B=\sum_{i=1}^m 2o_ix_i\quad C=\sum_{i=1}^m x_i^2\quad D=\sum_{i=1}^m o_i\quad E=\sum_{i=1}^m x_i $$

    首先考虑仅与 oio_i 相关的 A,DA,D

    一种暴力的方法是:对于每个左端点 ll,初始化区间按位或和为 o=0o=0。接下来右端点 rr 依次遍历 l,l+1,,nl,l+1,\dots,n,每次遍历到新的 rr 就将 oo 赋值为 oaro\vee a_r,就得到了区间 [l,r][l,r] 对应的按位异或和,分别累加 ooo2o^2 即可。

    仔细考虑整个过程,可以发现 oo 的变化是存在约束的。详细地说,在二进制下,oo 不断按位或并赋值的过程中,oo 中已经为 11 的二进制位不会变为 00,只有仍然为 00 的位可能在某次按位或后变成 11,并保留到当前左端点处理完。这么看来在 nn 较大时,oo 在右端点遍历过程中很多时候是不变的。具体地描述 oo 的改变次数,设 aa 的值域为 VV,每次改变会使 oo 二进制下 00 的个数至少减少 11(由于位运算特点,此处包括以下讨论只考虑每个数二进制下最低的 logV+1\lceil\log V\rceil+1 位),所以对于一个左端点,oo 的改变次数至多为 logV+1\lceil\log V\rceil+1 次。据此对右端点分段,可得到 O(logV)O(\log V) 段。每段中 oo 为定值,则对于 A,DA,D 的贡献易求。

    接下来考虑仅与 xix_i 相关的 C,EC,E

    按位异或没有上述按位或的性质,但区间按位异或可以用异或前缀和转化为两个数的异或。

    si=a1a2ais_i=a_1\oplus a_2\oplus\dots\oplus a_i,特别地,s0=0s_0=0。则对于区间 [l,r][l,r],$a_l\oplus a_{l+1}\oplus\dots\oplus a_r=s_{l-1}\oplus s_r$。

    仍然固定左端点 ll。设 bit(x,i){0,1}\mathrm{bit}(x,i)\in \{0,1\} 为自然数 xx 二进制下从低至高第 ii 位(从 00 开始)上的值,则对于每个位数 ii 和右端点 rr,若 $\mathrm{bit}(s_{l-1}, i)\oplus \mathrm{bit}(s_r,i)=1$,会对 EE 产生 2i2^i 的贡献。进一步地,若有 cnt1i,j\mathrm{cnt}1_{i,j}(其中 0ilogV,j{0,1}0\leq i\leq\lceil\log{V}\rceil,j\in\{0,1\}) 个右端点 rr 满足 lrnl\leq r\leq nbit(sr,i)=j\mathrm{bit}(s_r,i)=j,那么左端点 llEE 的贡献为 $\sum_{i=0}^{\lceil\log{V}\rceil}2^i\times \mathrm{cnt}1_{i,\mathrm{bit}(s_{l-1},i)\oplus1}$。

    CC 的计算与此类似。设 val(x,i)=2i×bit(x,i)\mathrm{val}(x,i)=2^i\times \mathrm{bit}(x,i),则

    $x=\sum_{i=0}^{\lceil\log{V}\rceil}\mathrm{val}(x,i)$,$x^2=\sum_{0\leq i,j\leq\lceil\log{V}\rceil}\mathrm{val}(x,i)\times \mathrm{val}(x,j)=\sum_{0\leq i,j\leq\lceil\log{V}\rceil}\mathrm{bit}(x,i)\times \mathrm{bit}(x,j)\times2^{i+j}$。

    对于每两个位数 i,ji,j 和右端点 rr,若 $\mathrm{bit}(s_{l-1},i)\oplus \mathrm{bit}(s_r,i)=1$ 且 $\mathrm{bit}(s_{l-1},j)\oplus \mathrm{bit}(s_r,j)=1$,会对 C 产生 2i+j2^{i+j} 的贡献。进一步地,若有 cnt2i,u,j,v\mathrm{cnt}2_{i,u,j,v}(其中 0i,jlogV,u,v{0,1}0\leq i,j\leq\lceil\log{V}\rceil,u,v\in\{0,1\})个右端点 rr 满足 lrnl\leq r\leq nbit(sl1,i)=u\mathrm{bit}(s_{l-1},i)=ubit(sl1,j)=v\mathrm{bit}(s_{l-1},j)=v,那么左端点 llCC 的贡献为 $\sum_{0\leq i,j\leq\lceil\log{V}\rceil}\mathrm{cnt}2_{i,\mathrm{bit}(s_{l-1},i)\oplus1,j,\mathrm{bit}(s_{l-1},j)\oplus1}\times2^{i+j}$。

    cnt1,cnt2\mathrm{cnt1,cnt2}ll 从大到小的遍历过程中不难求得,故 C,EC,E 可求。

    最后考虑 BB

    固定左端点 ll,并将右端点按照按位或的性质分段。设右端点 rrirji\leq r\leq j 的区间中,所得区间 [l,r][l,r] 按位或的值都是 oo,则这段的贡献为 2okxk=2oxk\sum 2o_kx_k=2o\sum x_k(即提出固定的 2o2o,不写出确切的上下界)。xk\sum x_k 仍考虑按二进制位计算贡献。设 1,2,...,k1,2,...,k 中有 cnt3k,u,v\mathrm{cnt}3_{k,u,v} 个位置 xx 满足 bit(sx,u)=v\mathrm{bit}(s_x,u)=v,则固定的 llirji\leq r\leq jrrBB 的贡献为 $2o\sum_{k=0}^{\lceil\log{V}\rceil}2^i\times(\mathrm{cnt}3_{j-1,\mathrm{bit}(s_{l-1},k)\oplus1}-\mathrm{cnt}3_{i-1,\mathrm{bit}(s_{l-1},k)\oplus1})$。

    cnt3\mathrm{cnt}3 可以在读入后初始化,故 BB 的计算可以与 A,DA,D 一同完成。

    复杂度分析

    对于 A,B,DA,B,D 分段过程的实现可以借助预处理数组 bi,jb_{i,j}: 表示最小的 kik\geq i 满足 bit(ak,j)=1\mathrm{bit}(a_k,j)=1。对于固定左端点 l,rl,r,从 ll 开始,借助 bb 找到下一个分段点 rrrr,使得右端点在 [r,rr)[r,rr) 中时对应区间的按位或为定值。由于有 O(nlogV)O(n\log V) 段,而次寻找下一个断点的时间复杂度为 O(logV)O(\log V),故分段过程总时间复杂度为 O(nlog2V)O(n\log^2{V})

    每一段中,A,DA,D 的贡献计算是 O(1)O(1) 的,而 BB 的计算需要枚举每个二进制位,时间复杂度为 O(logV)O(\log V),故 A,B,DA,B,D 的计算总时间复杂度为 O(nlog2V)O(n\log^2 V)

    对于 C,EC,E 的计算,在从大到小遍历左端点的过程中,cnt1\mathrm{cnt}1 的计算是每次 O(logV)O(\log V)cnt2\mathrm{cnt}2 的计算是每次 O(log2V)O(\log^2 V)。而通过 cnt1\mathrm{cnt}1 计算 EE 需要枚举每个二进制位,每个左端点时间复杂度为 O(logV)O(\log V);通过 cnt2\mathrm{cnt}2 计算 CC 需要枚举每对二进制位,每个左端点时间复杂度为 O(log2V)O(\log^2 V)。故计算 CC 的时间复杂度是 O(nlog2V)O(n\log^2 V),计算 EE 的时间复杂度是 O(nlogV)O(n\log V)

    对于空间复杂度,容易发现整个过程中数组开销最大为 O(nlogV)O(n\log V)

    总结

    综上所述,我们以 O(nlog2V)O(n\log^2 V) 的时间复杂度,O(nlogV)O(n\log V) 的空间复杂度解决了这个问题。

    • 1

    信息

    ID
    8316
    时间
    2000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者