【问题标题】:Multiple query updates on an array of elements对元素数组的多个查询更新
【发布时间】:2019-09-15 22:07:11
【问题描述】:

我有一个不一定排序的数组。我必须对其执行 Q 查询。 查询是这样的: 给定数组和索引 I。我必须将该数组中的所有元素从索引 i+1 更新为 n,使得 A[I]>A[j]。 查询相互依赖,即对查询 1 所做的更改将反映在查询 2 中。

对每个查询所做的更改如下:

for j=I+1 to N:
    if A[j]<A[I]:
      A[j]=0

我不知道如何解决这个问题。我正在考虑类似于二叉索引树的东西。但我不确定。在提示中,它说要使用高级排序算法。

【问题讨论】:

  • 您能否添加更多详细信息,例如“j”是什么以及要更新到的值?
  • @Kaushal 添加了代码 sn-p 使其更易于理解。

标签: algorithm sorting data-structures


【解决方案1】:

这里的 O((q+n) log n) 方法:

  1. 为给定数组的范围最小查询构建分段树
  2. 还创建一个标记为[] 的数组来跟踪应设为零的节点
  3. 现在对于每个查询:如果给定索引 I 被标记,则什么也不做(您没有为元素提供约束,所以我假设所有 A[i] >=0)
  4. 如果没有标记,我们可以在区间 [I+1, n] 中找到某个索引 j,使得 A[j] 是该区间内的最小值
  5. 如果这样的 A[j] >= A[i],我们将不符合查询
  6. 否则:
    • 标记索引 j, (marked[j] = true)
    • 将分段树设置位置 j 更新为某个较大的值(无穷大)
    • 从第 4 步继续执行,直到我们完成查询

这可能看起来很慢,因为对于每个查询,我们可能会在段树中进行 n 次更新,但我们可以注意到每个元素最多会被标记一次,所以最坏的情况是 O((q+n) log n)

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多