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

ftiasch
这个学院最强大的女孩子的朋友搬运于
2025-08-24 22:12:33,当前版本为作者最后更新于2021-03-08 10:18:19,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
Description
维护一个数组 ,支持 次下面 种操作:
- : 对于 , 把 设为 ;
- : 把 排序;
- : 返回 .
限制
Solution
对于集合 和数字 , 用 代表序列 ,其中
- ,
- .
把数组 划分成若干对子 使得
$$a = (\mathrm{sort}(S_1) \oplus x_1) + (\mathrm{sort}(S_2) \oplus x_2) + \dots $$
对于区间 的操作,假设存在 满足
$$a[l..r] = (\mathrm{sort}(S_i) \oplus x_i) + \dots + (\mathrm{sort}(S_j) \oplus x_j). $$否则,需要把至多 对 分裂。
-
操作,更新;
-
操作时,把这些对子合并为 $\mathrm{sort}((S_i \oplus x_i) \cup \dots \cup (S_j \oplus x_j))$.
-
操作时,查询 .
因此,集合 需要支持 种操作:
- where and ,
- ,
- ,
- .
Trie 支持这 个操作。为了节省空间,可以使用 Compacted Trie.
注意 , , 所以一个
uint32_t同时可以存下标记和长度。
全局使用一个线段树处理区间操作,把 存储在 .
区间操作前,找到 (and ) 的最后一个 ,处理可能的分裂。
复杂度是 .
- 1
信息
- ID
- 4627
- 时间
- 1500ms
- 内存
- 32MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者