1 条题解
-
0
自动搬运
来自洛谷,原作者为

Galex
流汗黄豆搬运于
2025-08-24 22:45:55,当前版本为作者最后更新于2023-02-22 21:02:43,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
先考虑简化所求答案:
对与原序列的 个区间,设区间按位或的值为 ,对应的按位异或的值为 ,则每个区间的 值为 ,所求答案即为 这 个数的方差的 倍 的值。
设这 个数的平均数为 ,方差为 ,考虑简化所求答案 :
$$\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} $$又由 ,有:
$$\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 $$首先考虑仅与 相关的 :
一种暴力的方法是:对于每个左端点 ,初始化区间按位或和为 。接下来右端点 依次遍历 ,每次遍历到新的 就将 赋值为 ,就得到了区间 对应的按位异或和,分别累加 和 即可。
仔细考虑整个过程,可以发现 的变化是存在约束的。详细地说,在二进制下, 不断按位或并赋值的过程中, 中已经为 的二进制位不会变为 ,只有仍然为 的位可能在某次按位或后变成 ,并保留到当前左端点处理完。这么看来在 较大时, 在右端点遍历过程中很多时候是不变的。具体地描述 的改变次数,设 的值域为 ,每次改变会使 二进制下 的个数至少减少 (由于位运算特点,此处包括以下讨论只考虑每个数二进制下最低的 位),所以对于一个左端点, 的改变次数至多为 次。据此对右端点分段,可得到 段。每段中 为定值,则对于 的贡献易求。
接下来考虑仅与 相关的 :
按位异或没有上述按位或的性质,但区间按位异或可以用异或前缀和转化为两个数的异或。
设 ,特别地,。则对于区间 ,$a_l\oplus a_{l+1}\oplus\dots\oplus a_r=s_{l-1}\oplus s_r$。
仍然固定左端点 。设 为自然数 二进制下从低至高第 位(从 开始)上的值,则对于每个位数 和右端点 ,若 $\mathrm{bit}(s_{l-1}, i)\oplus \mathrm{bit}(s_r,i)=1$,会对 产生 的贡献。进一步地,若有 (其中 ) 个右端点 满足 且 ,那么左端点 对 的贡献为 $\sum_{i=0}^{\lceil\log{V}\rceil}2^i\times \mathrm{cnt}1_{i,\mathrm{bit}(s_{l-1},i)\oplus1}$。
的计算与此类似。设 ,则
$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}$。
对于每两个位数 和右端点 ,若 $\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 产生 的贡献。进一步地,若有 (其中 )个右端点 满足 且 且 ,那么左端点 对 的贡献为 $\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}$。
而 在 从大到小的遍历过程中不难求得,故 可求。
最后考虑
固定左端点 ,并将右端点按照按位或的性质分段。设右端点 在 的区间中,所得区间 按位或的值都是 ,则这段的贡献为 (即提出固定的 ,不写出确切的上下界)。 仍考虑按二进制位计算贡献。设 中有 个位置 满足 ,则固定的 与 的 对 的贡献为 $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})$。
可以在读入后初始化,故 的计算可以与 一同完成。
复杂度分析
对于 分段过程的实现可以借助预处理数组 : 表示最小的 满足 。对于固定左端点 ,从 开始,借助 找到下一个分段点 ,使得右端点在 中时对应区间的按位或为定值。由于有 段,而次寻找下一个断点的时间复杂度为 ,故分段过程总时间复杂度为 。
每一段中, 的贡献计算是 的,而 的计算需要枚举每个二进制位,时间复杂度为 ,故 的计算总时间复杂度为 。
对于 的计算,在从大到小遍历左端点的过程中, 的计算是每次 , 的计算是每次 。而通过 计算 需要枚举每个二进制位,每个左端点时间复杂度为 ;通过 计算 需要枚举每对二进制位,每个左端点时间复杂度为 。故计算 的时间复杂度是 ,计算 的时间复杂度是 。
对于空间复杂度,容易发现整个过程中数组开销最大为 。
总结
综上所述,我们以 的时间复杂度, 的空间复杂度解决了这个问题。
- 1
信息
- ID
- 8316
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者