1 条题解

  • 0
    @ 2025-8-24 22:12:33

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ftiasch
    这个学院最强大的女孩子的朋友

    搬运于2025-08-24 22:12:33,当前版本为作者最后更新于2021-03-08 10:18:19,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    Description

    维护一个数组 a[n]a[n],支持 qq 次下面 33 种操作:

    • update(l,r,x)\mathrm{update}(l, r, x): 对于 i[l,r]i \in [l, r], 把 a[i]a[i] 设为 (a[i]x)(a[i] \oplus x);
    • sort(l,r)\mathrm{sort}(l, r): 把 a[l..r]a[l..r] 排序;
    • sum(l,r,x)\mathrm{sum}(l, r, x): 返回 a[l]a[r]a[l] \oplus \dots \oplus a[r].

    限制

    1n,q1051 \leq n, q \leq 10^5

    0ai,x<1080 \leq a_i, x < 10^8

    Solution

    对于集合 SS 和数字 xx, 用 sort(S)x\mathrm{sort}(S) \oplus x 代表序列 [s1x,,smx][s_1 \oplus x, \dots, s_m \oplus x],其中

    • S={s1,s2,,sm}S = \{s_1, s_2, \dots, s_m\},
    • s1sms_1 \leq \dots \leq s_m.

    把数组 a[n]a[n] 划分成若干对子 (S1,x1),(S2,x2),(S_1, x_1), (S_2, x_2), \dots 使得

    $$a = (\mathrm{sort}(S_1) \oplus x_1) + (\mathrm{sort}(S_2) \oplus x_2) + \dots $$

    对于区间 [l,r][l, r] 的操作,假设存在 iji \leq j 满足

    $$a[l..r] = (\mathrm{sort}(S_i) \oplus x_i) + \dots + (\mathrm{sort}(S_j) \oplus x_j). $$

    否则,需要把至多 22(S,x)(S, x) 分裂。

    • update\mathrm{update} 操作,更新xi,,xjx_i, \dots, x_j

    • sort\mathrm{sort} 操作时,把这些对子合并为 $\mathrm{sort}((S_i \oplus x_i) \cup \dots \cup (S_j \oplus x_j))$.

    • sum\mathrm{sum} 操作时,查询 k=ijsum(Sk)xk\bigoplus_{k = i}^j \mathrm{sum}(S_k) \oplus x_k.


    因此,集合 SS 需要支持 44 种操作:

    • partition(S,k)=(S,S)\mathrm{partition}(S, k) = (S', S'') where maxSminS\max S' \leq \min S'' and S=k|S'| = k,
    • flip(S,y)={xy:xS}\mathrm{flip}(S, y) = \{x \oplus y : x \in S\},
    • merge(S,S)=SS\mathrm{merge}(S, S') = S \cup S',
    • sum(S)=xSx\mathrm{sum}(S) = \bigoplus_{x \in S} x.

    Trie 支持这 44 个操作。为了节省空间,可以使用 Compacted Trie.

    注意 108<22710^8 < 2^{27}, 27<2527 < 2^5, 所以一个 uint32_t 同时可以存下标记和长度。


    全局使用一个线段树处理区间操作,把 (Si,xi)(S_i, x_i) 存储在 S1++Si1|S_1| + \dots + |S_{i - 1}|.

    区间操作前,找到 <l< l (and r\leq r) 的最后一个 (Si,xi)(S_i, x_i),处理可能的分裂。

    复杂度是 O((q+n)(logn+maxlogai))O((q + n) (\log n + \max \log a_i)).

    • 1

    信息

    ID
    4627
    时间
    1500ms
    内存
    32MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者