我们假设我们有n个范围,每个范围由
指定 [l_i,r_i] where 1<=i<=n
我们有一个类型为[L,R]的查询,其中我们必须找到在给定范围内完全的n个范围中的范围数,即[L,R] < / p>
示例:
n范围是:
这里n是2。
2 4
3 3
对于查询3 5,输出应为1.
对于查询2 5输出应为2.
我知道O(m * n)的方法,其中n是范围数,m是查询数,但感觉必须有更高效的实现。
答案 0 :(得分:1)
是的,有。您想要的数据结构称为interval tree。
答案 1 :(得分:0)
对于以下解决方案,每个查询都有复杂度O(log(n)),但它需要存储(n ^ 2/2)范围,并且预处理需要对范围进行排序(复杂度O(n * n log(n))使用quicksort):
预处理:
对于每个范围[L_i,R_i]:
a)找到L_j> = L_i为真的所有范围[L_j,R_j]的子集S_i。
b)按R_j
查询[L,R]:
让我们回到你的例子: S_1:[3 3] [2 4] S_2:[3 3]
查询3 5在S_2中结束。显然,有一个条目也满足第二个条件
查询2 5在S_2中结束。第二个条目是满足R条件的最大条目,因此结果是2