以 |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
由于b
和a
是常数,我们可以使用预计算在常数时间内得到每个查询的答案。
对于给定的x
,有两种情况:
- 最小值位于
x
的左侧(即 a < x
)。如果我们知道所有带a < x
的行的b-a
的最小值,我们可以在O(1)时间内得到答案。
- 类似地,当最小值位于
x
的右边时(即a >= x
),如果我们知道所有带a >= x
的行的最小值b+a
,我们可以在 O(1) 时间内得到答案。
综上所述,我们需要知道x
左边的所有a
的最小值b-a
和所有[的b+a
的最小值=14=] 在 x
的右边。这可以使用简单的 prefix and/or suffix array 实现轻松完成。
有点与我所做的无关,但我偶然发现了这个有趣的数据结构。我想不通一些细节。
假设我有 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
由于b
和a
是常数,我们可以使用预计算在常数时间内得到每个查询的答案。
对于给定的x
,有两种情况:
- 最小值位于
x
的左侧(即a < x
)。如果我们知道所有带a < x
的行的b-a
的最小值,我们可以在O(1)时间内得到答案。 - 类似地,当最小值位于
x
的右边时(即a >= x
),如果我们知道所有带a >= x
的行的最小值b+a
,我们可以在 O(1) 时间内得到答案。
综上所述,我们需要知道x
左边的所有a
的最小值b-a
和所有[的b+a
的最小值=14=] 在 x
的右边。这可以使用简单的 prefix and/or suffix array 实现轻松完成。