假设您有一个已知长度为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] = inf
,arr[1] = 6
,arr[2] = 2
...
要解决这个问题,我有以下想法:
蛮力方法(接受每个查询并更新数组)。
细分树(有或没有延迟传播)。
有没有其他方法可以解决这个问题(比如在sqrt分解的帮助下或者使用其他数据结构,比如堆栈或队列)来线性地或更复杂地解决它。
答案 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是元素数