在查询后查找每个索引的最小值

时间:2015-07-07 13:45:26

标签: c arrays algorithm

假设您有一个已知长度为N的数组,它被初始化为无穷大。

(L,R,Val)形式的查询已激活,0 <= L <= R <= N-1。每个查询都会更新数组

for all i in [L, R]
  array[i] = min(Val, array[i])

例如:

初始化:N = 5 - 数组为{inf, inf, inf, inf, inf}

查询1:(1, 3, 6) - 数组转换为{inf, 6, 6, 6, inf} 查询2:(2, 4, 2) - 数组转换为{inf, 6, 2, 2, 2}

要求:在所有查询之后,找到每个元素索引处的值。

考虑上面名称为arr的数组,然后 - arr[0] = infarr[1] = 6arr[2] = 2 ...

要解决这个问题,我有以下想法:

  1. 蛮力方法(接受每个查询并更新数组)。

  2. 细分树(有或没有延迟传播)。

  3. 有没有其他方法可以解决这个问题(比如在sqrt分解的帮助下或者使用其他数据结构,比如堆栈或队列)来线性地或更复杂地解决它。

1 个答案:

答案 0 :(得分:0)

是的,你可以用这种方式解决这个问题。
Event is structure which consist boolean start/finish, value and coordinate Every query transform in two events. For example query L:1 R:5 VAL: 10 transform in event TRUE 10 1 and event FALSE 10 5 than sort all events by coordinate value next go through events and maintain current minimum and fill array You can maintain minimum with a lot of different data structures( for example you can use map in CPP)

该解决方案的复杂性为O(M log M +(N + M)log M) 其中M是查询数,N是元素数