------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注意这是一个暴力算法
1 背景与来源
* 起源题目:CF 896C Willem, Chtholly and Seniorious
* 正式名称:Old Driver Tree
* 本质:基于 set 的区间暴力合并
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 适用条件(非常重要)
2.1 必须满足
存在大量区间赋值\text{存在大量区间赋值} 存在大量区间赋值
2.2 推荐环境
* 随机数据
* 对复杂度要求不严格
* 比赛 / 快速实现
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3 核心思想
3.1 区间表示
数组被划分为若干连续段:
[l1,r1,v1],[l2,r2,v2],…[l_1,r_1,v_1],[l_2,r_2,v_2],\dots [l1 ,r1 ,v1 ],[l2 ,r2 ,v2 ],…
相同值合并为一个节点。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.2 关键直觉
> 区间赋值会急剧减少段数
期望段数:
E[k]=O(logn)\mathbb{E}[k]=O(\log n) E[k]=O(logn)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4 数据结构定义
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 核心操作
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5.1 SPLIT(拆分)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5.2 ASSIGN(区间赋值)
✅ ODT 的灵魂
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6 区间查询
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6.1 区间和
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6.2 区间加
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6.3 区间 K 小
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6.4 区间幂次和
∑i=lraik mod m\sum_{i=l}^{r} a_i^k \bmod m i=l∑r aik modm
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7 完整可用模板(CF 896C)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8 复杂度分析
8.1 均摊复杂度
操作 均摊 assign O(logn)O(\log n)O(logn) query O(logn)O(\log n)O(logn)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8.2 理论警告
Worst Case=O(n)\text{Worst Case}=O(n) Worst Case=O(n)
不可用于正经数据结构题证明
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
9 与其他结构对比
结构 稳定性 实现难度 ODT 低 ⭐ 线段树 高 ⭐⭐⭐ 平衡树 高 ⭐⭐⭐⭐ 分块 中 ⭐⭐
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10 常见错误
* 忘记 mutable
* 忘记 split(r+1)
* 没有区间赋值
* 在严肃比赛中依赖 ODT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
11 进阶方向
* ODT 随机性证明
* ODT + 哈希
* ODT 离线技巧
* ODT 与线段树混合
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------