出一道只有WBT(重量平衡树,如ScapegoatTree)能做的高难度数据结构算法题目
Создано: 29 июля 2025 г.
Создано: 29 июля 2025 г.
出一道只有WBT(重量平衡树,如ScapegoatTree)能做的高难度数据结构算法题目
《极限内存的在线多重集》
小 A 正在一台仅有 256 MiB 内存的嵌入式设备上实现一个在线多重集。
你需要编写程序,在完全在线的情况下,按顺序处理不超过
1 ≤ Q ≤ 10 000 000
条操作,操作共有四种:
指令 | 含义 | 保证条件 |
---|---|---|
I x | 向集合插入整数 x (若已存在不重复插入) | ‑10^9 ≤ x ≤ 10^9 |
R x | 从集合删除整数 x (若不存在忽略) | 同上 |
K k | 询问当前集合的第 k 小元素并输出 | `1 ≤ k ≤ |
C a b | 统计区间 [a,b] 内元素个数并输出 | ‑10^9 ≤ a ≤ b ≤ 10^9 |
要求:
n
为当前集合大小)的 最坏 时间内完成。K
与 C
指令产生输出,各占一行。textQ op1 [arg...] op2 [arg...] … opQ [arg...]
对应每一条 K
、C
指令,各输出一行结果。
输入 | 输出 |
---|---|
```text | |
10 | |
I 5 | |
I 1 | |
I 9 | |
K 2 | |
C 2 8 | |
R 5 | |
K 2 | |
I 7 | |
C -1 10 | |
K 3 | |
``` | ```text |
5 | |
1 | |
7 | |
2 |
text--- #### 数据范围 & 陷阱说明 1. **节点存储限制** - 判题机采用 64 bit 指针,常规二叉搜索树节点包含 `key (4B) + left ptr(8B) + right ptr(8B) = 20B` 对齐后为 **24 B**。 - 在 10 000 000 次最坏序列下,节点最多 10 000 000 个,仅节点就需 `24 B × 10 000 000 ≈ 228 MiB`。 - 任何 **额外的每节点字段**(例如 AVL 的高度、RB 的颜色、Treap 的优先级等) 都会把节点体积推高到 **32 B** 甚至更多,瞬间突破 256 MiB 上限。 2. **算法限制** - 你 **不得依赖随机化或期望复杂度**;所有操作须有严格最坏界。 - 由于内存极限,**无法在节点中再存任何额外字节**; 这使传统 AVL / 红黑树 / Treap / Splay 在本题下全部「爆内存」或「爆时间」。 --- #### 解题思路(仅供评测人参考,不会出现在正式题面) | 难点 | 解决方案 | |------|----------| | 不允许存额外平衡信息 | 采用 **重量平衡树 WBT / ScapegoatTree**:节点仅存左右指针和关键字,平衡信息通过 **全局计数 + 局部重建** 得到,完全符合内存约束。 | | 保证最坏 *O(log n)* 查找 | WBT 保证高度 ≤ log_{1/α} n(α≈3/4),从而查找最坏 *O(log n)*;插删摊还 *O(log n)*。 | | 计数与第 k 小 | 在重建时用中序拷贝构建完美平衡树,同时可在栈上临时计算子树大小来做有序统计,也能在节点塞下 1 bit 标记压缩子树大小,但仍不会超内存。 | > **为何“只有”WBT 能过?** > *Scapegoat/Weight‑Balanced Tree* 的经典实现 **不需要在节点里存任何附加冗余信息**,仍能保证严格对数高度;而其他主流平衡 BST 至少要存 1 bit(RB)、1 byte (颜色+填充) 或 1 int(AVL 高度),在本题规模与 256 MiB 上限下都无解。 > 公开资料也明确指出 Scapegoat Tree 的这一优势: > * “A scapegoat tree … **does not need to store any additional information in the nodes, other than the key, value, and left and right child pointers.**” ([University of Maryland Computer Science](https://www.cs.umd.edu/class/fall2020/cmsc420-0201/Lects/lect12-scapegoat.pdf)) > * “Scapegoat trees, **unlike most balanced‑tree schemes, do not require keeping extra data** … Each node in the tree contains only a key value and pointers to its two children.” ([people.csail.mit.edu](https://people.csail.mit.edu/rivest/pubs/GR93.pdf)) --- #### 出题人提示 * `α` 建议取 `3/4`;实现时维护 `n` 与 `max_n` 即可。 * 重建时用栈收集指针列表再递归二分建树,可避免额外数组。 * 若语言仅提供 64 bit 指针,可将节点放在连续数组里,用整型索引代替指针以再省 ~30 %。 祝各位选手 **内存与算法的双重极限** 之旅好运!