我试图解决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不参加时 优秀“。
现在我很难理解这个解决方案。
以下是我对此解决方案的理解:我知道二进制索引树用于回答查询,例如查找数组中间隔的总和,并且它还支持元素中的更新。它同时执行O(logn)时间复杂度的操作。现在这个解决方案说我们用键作为c i 构建BIT,并将值作为b i 构建,基本上是b i 是一个附加值与每个节点一起使用。现在我们在树中插入元素,增加 i 的值,这是我失去了抓地力的地方。我们插入节点的顺序以及声明在该部分之后所说的内容如何重要,我不知道。
请帮助我理解这个解决方案的内容。
答案 0 :(得分:3)
让我们找到所有非优秀的参与者。另一位参与者j
只有在他i
时才能比参与者a[j] < a[i]
更好。因此,我们可以忽略具有较大值a[j]
的所有参与者。这就是我们按a
对其进行排序的原因。
这种情况是必要的,但还不够。我们还需要检查b
和c
。我们怎么做?我们需要知道是否有一个人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来解决二维问题。