我们有一个由每个条目组成的数组作为两个整数的元组。让数组为A = [(a1, b1), (a2, b2), .... , (an, bn)]
。现在我们有多个查询,我们得到一个整数x
,我们需要找到ai + |x - bi| for 1 <= i <= n
的最大值。
我理解这可以在每个查询的O(n)
时间复杂度中轻松实现,但我正在寻找比这更快的东西,可能O(log n)
用于每个查询。我可以在O(n)
时间内预处理数组,但查询应该比O(n)
更快。
任何形式的帮助都将受到赞赏。
答案 0 :(得分:0)
过度思考这一点似乎太容易了
对于n = 1
,函数是v形的,a1
的最小b1
,斜率分别为-1和1 - 让我们称这些值ac
和{ {1}}(对于合并)
对于另外一对bc
,其中一对可以支配另一对((ai, bi)
),然后可以将其忽略。
否则,组合的下降斜率将来自具有较大|bc - bi| ≤ |ac - ai
的对,即从另一个上升的斜率。
最小值将介于个体b
之间,更接近b
对,b
更大,距离是(绝对值)“坐标”之差的一半差异,金额越高的最小值
主要的问题是两者都不需要是一个整数 - 唯一的选择是正好在两个整数之间的中间。
(结束时,最大a
的下降斜率和最大ai + bi
的上升斜率。)