1 条题解

  • 0
    @ 2022-4-14 15:53:23

    いずれその陽は落ちるとしても

    题意:

    给一个序列 a1,a2,,ana_1, a_2, \dots, a_nmm 次查询区间 [li,ri][l_i, r_i] 所有子序列去重之和之和模 pip_i

    1n,m,ai105,1p1091 \leq n, m, a_i \leq 10 ^ 5, 1 \leq p \leq 10 ^ 9

    题解:

    考虑每个子区间由每种数出现的第一次进行贡献。

    对一个数值 vv 和区间 [l,r][l, r] ,令 prexpre_xaxa_x 在这个区间内在它之前同值前面出现的次数, len:=rl+1len := r - l + 1 ,显然某个 ax=va_x = v 的贡献为:

    2lenpre(v)1v2 ^ {len - pre(v) - 1} v

    cnt(l,r,v)cnt(l, r, v)vv[l,r][l, r] 出现的次数,那么所有值为 vv 的位置的贡献为:

    $$\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 $$

    注意到 v1010\sum v \leq 10^{10} ,前者直接维护本质不同的数的和即可,在莫队的过程中很容易维护。

    后者在模数改变的时候似乎仍然是 O(len)\mathcal{O}(len) 的。

    然而 cntx=n\sum cnt_x = n 这个性质可以导出推论,即本质不同的 cntxcnt_x 的个数不多于 2n2 \sqrt n 个(大于 n\sqrt ncntcnt 至多 n\sqrt n 个不然和会大于 nn )。

    后半个式子按照 cntcnt 分类:

    $$\sum_{cnt} 2 ^ {len - cnt} \sum_{cnt(l, r, v) = cnt} v $$

    统计每个出现次数的权值和在莫队过程中可以 O(1)\mathcal{O}(1) 插入删除 O(n)\mathcal{O}(\sqrt n) 项枚举上面的和式。

    那么复杂度就是 O(mnlogn+nm)\mathcal{O}(m \sqrt n \log n+ n \sqrt m) 的。

    然后求幂次的过程仍然能优化。

    现在需要在每次查询中求出所有 2cnt2^{cnt} ,暴力快速幂是 O(nlogn)\mathcal{O}(\sqrt n \log n) 的。但是可以根号分治优化到 O(n)\mathcal{O}(\sqrt n)

    把值域按照 n\sqrt n 分块,求块头,块内的值是一个 <n< \sqrt n 的幂次。两者都是能在 O(n)\mathcal{O}(\sqrt n) 的时间内进行预处理,然后支持 O(1)\mathcal{O}(1) 查询的。

    具体地,预处理 20,21,,2n12^0, 2^1, \dots, 2^{\sqrt n - 1} ,预处理 $2^{\sqrt n}, 2 ^ {2 \sqrt n}, \dots, 2 ^ {\lfloor \frac{n}{\sqrt n} \rfloor \sqrt n}$ ,然后 cnt=kn+rcnt = k \sqrt n + r

    这样子复杂度降低到了 O(mn+nm)\mathcal{O}(m \sqrt n + n \sqrt m)

    • 1

    信息

    ID
    4000
    时间
    3000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    6
    已通过
    4
    上传者