找到包含整数的第 k 个最短区间

finding the kth shortest interval containing an integer

我面临以下问题:我需要编写一个程序,将 n 区间 [a,b]m(k,d) 作为输入。对于每个 (k,d) 对,程序应输出第 k 个最短区间的长度(其中区间的长度定义为 b - a + 1),其中 a <= d <= b。如果 d 不在任何区间内,或者 d 在小于 k 区间内,程序应该输出 -1.

示例input/output:

第一个整数(5)表示n。接下来的 n 行包含间隔(因此 [2..4]、[2..6] 等)。下面是整数 m (3),后跟 m(k,d).

我正在寻找能够尽快解决这个问题的算法。

这可以在 O((n + m) log n) 中解决sweep line algorithm.

的时间

扫描线算法设置一个定时事件列表,然后按排序顺序处理它。对于这个问题,每个区间 [a, b] 在时间 a 引起一个开始事件以及时间 b 的停止事件。每个查询 (k, d) 在时间 d 引起一个查询事件。由于区间是完全闭合的,所以每次我们处理开始事件,然后查询事件,然后停止事件。

我们维护一个由扫描点刺穿的间隔长度的排序列表。要处理开始事件,请将间隔的长度添加到列表中。要处理停止事件,请从列表中删除间隔的长度。要处理查询事件,请检索列表的 kth 元素。在 O(log n) 时间内支持所有这些操作的排序列表数据结构是一个红黑树,其中每个节点包含其左子树中的节点数。这几乎是树扩充的典型示例,因此 CLRS 和许多其他来源应该有详细信息。