对于给定的数组,按递减顺序计算三个元素的组合

时间:2016-10-19 19:47:35

标签: algorithm segment-tree

我正在解决过去比赛中的一个问题,所以我需要帮助,我会用一句话来解释这个问题。你有一个大小为N的数组,其中N可以达到10 ^ 5。然后在第二行你有N个元素。所以现在你必须计算从数组中选择三个元素的方法,使它们按递减顺序排列。这是示例

N = 4且数组看起来像190,180,170,168。我们有四种方法可以选择这三个元素。 1.(190,180,170)2.(190,180,168)3.(190,170,168)和4.(180,170,168)

我认为这应该用分段树来解决,但我不知道应该用哪个参数创建树。提前谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 我们可以假设所有数字都在[0, n - 1]范围内(否则,我们可以'压缩'它们)。

  2. 让我们修复三元组中间元素的位置。现在我们可以计算左边更大元素的数量,并乘以右边较小元素的数量。

  3. 如何计算索引较小的较大元素的数量?这是一个解释它的伪代码:

    tree = SegmentTree(0, n - 1) // for sum and add operations
    for i = 0 ... n - 1
        greaterLeft[i] = tree.getSum(a[i] + 1, n - 1)
        tree.update(a[i], 1)
    
  4. 请注意,我们需要更新一个点和一个范围的总和。二进制索引树可以有效地完成它(它比段树更容易实现)。