二叉索引树的应用

时间:2017-05-28 07:00:35

标签: algorithm tree binary-indexed-tree

我试图解决this算法问题,我遇到了这个很好的解决方案:

  

“我们的想法是对待 i ,b i 和   c i 不对称。 BIT支持最低限度   查询从1开始的关键间隔。我们使用c i 作为值和   b i 作为键。按增加 i 的顺序插入。这个   方式,对于每个 i 依次,数据结构允许查询   [1..b i )中b j 的c j (可能为∞)的最小值   a j &lt;一个<子> I 。我们有c j &lt; c i 当且仅当参赛者i不参加时   优秀“。

     

source

现在我很难理解这个解决方案。

以下是我对此解决方案的理解:我知道二进制索引树用于回答查询,例如查找数组中间隔的总和,并且它还支持元素中的更新。它同时执行O(logn)时间复杂度的操作。现在这个解决方案说我们用键作为c i 构建BIT,并将值作为b i 构建,基本上是b i 是一个附加值与每个节点一起使用。现在我们在树中插入元素,增加 i 的值,这是我失去了抓地力的地方。我们插入节点的顺序以及声明在该部分之后所说的内容如何重要,我不知道。

请帮助我理解这个解决方案的内容。

1 个答案:

答案 0 :(得分:3)

让我们找到所有非优秀的参与者。另一位参与者j只有在他i时才能比参与者a[j] < a[i]更好。因此,我们可以忽略具有较大值a[j]的所有参与者。这就是我们按a对其进行排序的原因。

这种情况是必要的,但还不够。我们还需要检查bc。我们怎么做?我们需要知道是否有一个人a[j] < a[i](也就是那个按排序顺序排在当前人之前的那个人),以及他的b[j] < b[i]c[j] < c[i]。我们构建一个BIT(c[j]作为键,b[j]是值)来检查最后两个条件。很明显,当且仅当前缀j上的最小值小于[0, c[i])时才存在b[i]

总而言之,这个想法如下:我们按a[i]对它们进行排序,然后忽略a的值。通过这种方式,我们可以从3-D转向2-D问题,这个问题更容易解决(这就是订单重要的原因。a[i]更大的人永远不会更好。)我们使用BIT来解决二维问题。

相关问题