如何有效地解决多个查询?

时间:2019-06-26 21:32:42

标签: c++ algorithm query-optimization

我正在使用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^18a[pos] = 10^18,则会导致整数溢出。

0 个答案:

没有答案