线段树与离线询问
线段树与离线询问
线段树与离线询问结合的问题在 OI 领域也有出现。
假设一个数据结构,允许以 \(O(T(n))\) 的时间复杂度添加元素。本文描述一种允许以 \(O(T(n)\log n)\) 的时间复杂度进行离线删除的技术。
算法
从被添加开始到被删除结束,每个元素都在数据结构中存活一段时间。
在查询上构建一个线段树。元素处于活动状态的线段将拆分变为树的 \(O(\log n)\) 节点。查询有关结构的信息时,将每个查询放入相应的叶节点中。
为了处理所有查询,在段树上运行深度优先搜索。进入节点时,添加该节点中的所有元素。然后进一步查找该节点的子节点,如果该节点是叶节点则回答查询。离开节点时撤消添加。
如果更改结构的时间复杂度为 \(O(T(n))\),可以通过设置一个栈保留更改,以 \(O(T(n))\) 的时间复杂度回滚。回滚不维持均摊复杂度。
注意
当某个对象处于活动状态时,在线段上创建线段树的想法不仅适用于数据结构问题。
实现
此实现用于动态连接问题。它可以添加边、删除边和计算连接的零部件数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
|
本页面主要译自博文 Deleting from a data structure,版权协议为 CC-BY-SA 4.0。
习题
Codeforces - Connect and Disconnect
Codeforces - Addition on Segments
Codeforces - Extending Set of Points
本页面最近更新:,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:OI-wiki
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用