我想在给定数组(n个元素)中找到一个元素,使得左半边乘积和右半边乘积之间的绝对差最小 p>
(abs(arr[0]*arr[1]*...arr[x]-arr[x+1]*arr[x+2]...arr[n]))
该问题还会定期“ m”次更新数组的值。我想获取O(m log n)中所有查询的答案。
我尝试了一种耗时O(n * m)的方法,由于TLE错误而无法使用。
答案 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)。