Problem 14-1
a.假设我们有一个最大重叠点p,然后,只要我们想象移动点p但不经过任何区间的任何端点,那么我们不会改变包含p的区间的数量,所以,我们只是向右移动,直到我们到达某个区间的端点,然后,我们有一个最大重叠点,也就是区间的端点。
b.我们将给出一个简单的解决方案来解决这个问题,它的运行时间为O(nlg (n)),它不会增加红黑树,尽管这是提示所建议的。考虑一个元素列表,每个元素都有一个整数x.pos和一个字段,该字段表示它是左端点还是右端点。x.dir = L或R。然后,根据每个元素的pos属性对该列表排序。然后,在列表中运行当前所处间隔的总数,为每个右端点减去一个,为每个左端点添加一个。还要跟踪这些值的运行最大值,以及具有该值的端点。那么,这个达到运行最大值的点就是应该返回的。
Problem 14-2
a.创建一个循环双链表。继续在列表中前进m个位置(不包括哨兵),然后打印并删除当前节点,直到列表为空。因为m是一个常数,我们最多前进了mn个位置,所以运行时间是O(n)。
b.首先为给定的元素创建一个顺序统计树,其中秩从0开始到n - 1结束,节点的秩是其在原始顺序中的位置减去1,并且我们将每个元素的值存储在属性x.value中。打印秩为m(n)−1的元素,然后将其从树中删除。然后按如下步骤进行:如果你刚刚打印了第k个值,其秩为r,则从树中删除该节点,那么要打印的第(k+ 1)值的秩为r−1 + m(n) mod (n−k)。由于删除和查找需要O(lg n),且有n个节点,因此运行时间为O(n lg n)。