证明两个区间就足够了:选择适当包含在另一个区间中的区间是没有意义的。不失一般性,让区间为 [a1, b1], ..., [an, bn] 使得 a1 < ... < an。如果没有区间正确包含另一个区间,则 b1 < ... < bn。对于 i < j < k,它认为 ([ai, bi] intersect [aj, bj] intersect [ak, bk]) = ([ai, bi] intersect [ak, bk]) 和 union 相同,所以没有理由选择两个以上的区间。
O(n log n)-time algorithm:重新制定,问题是找到区间 [a, b] 和 [c, d] 最大化 (d - a) * (b - c),因为这个乘积是负的,当且仅当区间不要相交。我们的算法是进行 O(n log n) 预处理,使我们能够在 O(log n) 时间内为每个间隔找到最佳配对。
让我们努力寻找 [a, b] 的最佳伴侣。做一些代数:(d - a) * (b - c) = d*b - d*c - a*b + a*c。由于 a, b 是固定的,我们可以去掉 -a*b 项并在所有区间 [c, d] 上最大化内积 <(a, b, 1), (d, c, -d*c)>。由于向量集 (d, c, -d*c) 是固定的,这本质上是模拟静止多面体与垂直于 (a, b, 1) 的移动平面的碰撞。感谢 Edelsbrunner 和 Maurer(Findingextreme points in three dimensions and solve the post-office problem in the plane,1984),有一种算法可以在时间 O(n log n) 中进行预处理,并针对不同的 a 和 b 解决这种类型的查询在 O(log n) 时间内。
一个糟糕的细节是我们必须至少选择两个区间,但最好的“解决方案”可能只是与自身最长的区间。我相信这很混乱,但可以扩展 Edelsbrunner-Maurer 以在相同的运行时间内找到第二个最极端的点。