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