区间树
给定一组区间,对于任意点 ,筛选出所有包含它的区间。
若所有区间的交非空: 取它们的一个公共点 ,做预处理,按照由远及近的顺序分别将各个区间的左右端点进行排序。 此后对于任意查询 ,不妨设 ,只需由远及近地遍历右端点并判断是否大于 即可,时间复杂度为 ,输出敏感。
采用分治的思想,将区间按照所有端点中位数 和区间左右端点的关系分为三类。对于 ,按前法可以解决。对于 和 ,分别交给左右子树,左右子树继续递归地划分。
深度? 树占用空间? 对于每个树上的节点,用两个列表保存节点内的区间的有序左端点和有序右端点。 则每个区间存了两遍,总空间复杂度为
如何构造?
- 先对所有端点排序
- 取中点
- 遍历区间列表,将区间分为三类
- 对于当前节点应该存储的区间,分别将有序的左右端点存入列表
- 递归构造左右子树
- 时间复杂度为 查询:对于每个节点,先报告自身查询结果,然后根据 和 的大小关系对子树进行查询,总时间复杂度为