我正在使用C ++编程语言。
给出一个整数数组。我们需要处理有关 以下两种类型:
类型1:
pos,val(提供给我们的值)
将val乘以A[pos]
,即
A[pos]=A[pos]*val
(您无需在此查询中打印任何内容)
类型2:
打印一个整数X,以使以下两个值(A[1] * A[2] *...... A[X])
和(A[X+1] * A[X+2] * ....A[N])
之间的绝对差最小。如果X
有多个这样的值,请打印最小的值。
数组的大小可以最大为10^5
查询数量= 10^5
数组中任何元素的范围和val的范围:[1,10^r]
r = 18
示例:
给出数组:[2,2,2,2,2,2,2,2]
查询数量:2(为说明仅取小数值)
第一个查询的类型为2,答案为4,因为4是将数组分为两半的最小索引,其第一部分的乘积为2 * 2 * 2 * 2 = 16,第二部分的乘积为2 * 2 * 2 * 2 = 16。因此值abs(16-16)= 0,这是可能的最小值。
第二个查询的类型为1,其中val = 2和pos = 3。
第二个查询:数组更改为[2,2,4,2,2,2,2,2]
我的方法是:对于类型2的每个查询,遍历需要O(N)时间的整个数组。如果有“ S”查询。总时间复杂度为O(N * S)
。我正在寻找一种有效的方法来完成O(logN * S)
中的任务。我的方法的另一个缺陷是:如果对某些查询使用val = 10^18
和a[pos] = 10^18
,则会导致整数溢出。