获得左半积和右半积的绝对差最小的元素

时间:2019-06-26 19:40:18

标签: python c++ algorithm

我想在给定数组(n个元素)中找到一个元素,使得左半边乘积和右半边乘积之间的绝对差最小

(abs(arr[0]*arr[1]*...arr[x]-arr[x+1]*arr[x+2]...arr[n]))

该问题还会定期“ m”次更新数组的值。我想获取O(m log n)中所有查询的答案。

我尝试了一种耗时O(n * m)的方法,由于TLE错误而无法使用。

1 个答案:

答案 0 :(得分:1)

我想到的唯一方法是

这么大的数字很难相乘。

我们可以将其隐藏为

  

log10(A [1] A [2] ... * A [x])-log10(A [x + 1] A [x + 2] .. * A [n])
  log10(A [1])+ log10(A [2])+ .. + log10(A [x])-log10(A [x + 1])+ log10(A [x + 2])+ .. + log10(A [n])

现在这些结果可存储为两倍。

以abs((A [1] A [2] ... * A [x])-(A [x + 1] A [x + 2] .. * A [n]))应该最小化,   这个方程将遵循三元搜索规则。

因此,在三元搜索的每次迭代中,我们都需要

的结果
  

log(A [1])+ log(A [2])+ .. + log(A [x])
      和
       log(A [x + 1])+ log(A [x + 2])+ .. + log(A [n])

由于有一些更新,我们需要一个数据结构来查找较低的 像分段树这样的复杂性。

因此,每个查询的总体复杂度将为log(n)* log(n)。