以 |x-a| 的形式查询多个方程在 x 处的最小值+ b

Query min value at x of many equations in the form |x-a| + b

有点与我所做的无关,但我偶然发现了这个有趣的数据结构。我想不通一些细节。

假设我有 N<10^5 个形式为 y = |x-a| 的方程式+ b,其中 0 < x、a、b < 10^5。在 O(N) 预处理之后,对于任何 x,我想在常数时间内找到所有这些方程中的最小值。

这是我目前所拥有的:在递增的 a 值中一个一个地添加函数,以某种方式找到新函数与最小现有函数之间的交集,然后存储路口。交叉点可以告诉我们最小值使用什么方程式。然后我们可以对日志时间查询使用二进制搜索,但由于 x<10^5,我们可以遍历所有值并为每个 x

预先计算正确的最小值

可视化,其中黑色是最小值

模数的基本属性是

1. |x| = x if x>=0
2. |x| = -x if x<0

利用这个,等式y = |x-a|+b可以写成

1. y = x + (b-a) if x >= a
2. y = (b+a) - x if x<a

由于ba是常数,我们可以使用预计算在常数时间内得到每个查询的答案。
对于给定的x,有两种情况:

  1. 最小值位于 x 的左侧(即 a < x)。如果我们知道所有带a < x的行的b-a的最小值,我们可以在O(1)时间内得到答案。
  2. 类似地,当最小值位于x的右边时(即a >= x),如果我们知道所有带a >= x的行的最小值b+a ,我们可以在 O(1) 时间内得到答案。

综上所述,我们需要知道x左边的所有a的最小值b-a和所有[的b+a的最小值=14=] 在 x 的右边。这可以使用简单的 prefix and/or suffix array 实现轻松完成。