1 条题解
-
0
いずれその陽は落ちるとしても
题意:
给一个序列 , 次查询区间 所有子序列去重之和之和模 。
。
题解:
考虑每个子区间由每种数出现的第一次进行贡献。
对一个数值 和区间 ,令 为 在这个区间内在它之前同值前面出现的次数, ,显然某个 的贡献为:
设 为 在 出现的次数,那么所有值为 的位置的贡献为:
$$\sum 2 ^ {len - 1} v + 2^{len - 2} v + \dots + 2^{len - cnt(l, r, v)} v = 2 ^ {len} v - 2 ^{len - cnt(l, r, v)} v $$那么所有数的贡献为:
$$2 ^ {len} \sum_{v \in \{a_l, a_{l + 1}, \dots, a_r\}} v - \sum_{v \in \{a_l, a_{l + 1}, \dots, a_r\}} 2^{len - cnt(l, r, v)} v $$注意到 ,前者直接维护本质不同的数的和即可,在莫队的过程中很容易维护。
后者在模数改变的时候似乎仍然是 的。
然而 这个性质可以导出推论,即本质不同的 的个数不多于 个(大于 的 至多 个不然和会大于 )。
后半个式子按照 分类:
$$\sum_{cnt} 2 ^ {len - cnt} \sum_{cnt(l, r, v) = cnt} v $$统计每个出现次数的权值和在莫队过程中可以 插入删除 项枚举上面的和式。
那么复杂度就是 的。
然后求幂次的过程仍然能优化。
现在需要在每次查询中求出所有 ,暴力快速幂是 的。但是可以根号分治优化到 。
把值域按照 分块,求块头,块内的值是一个 的幂次。两者都是能在 的时间内进行预处理,然后支持 查询的。
具体地,预处理 ,预处理 $2^{\sqrt n}, 2 ^ {2 \sqrt n}, \dots, 2 ^ {\lfloor \frac{n}{\sqrt n} \rfloor \sqrt n}$ ,然后 。
这样子复杂度降低到了 。
- 1
信息
- ID
- 4000
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 6
- 已通过
- 4
- 上传者