我正在解决过去比赛中的一个问题,所以我需要帮助,我会用一句话来解释这个问题。你有一个大小为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)
我认为这应该用分段树来解决,但我不知道应该用哪个参数创建树。提前谢谢。
答案 0 :(得分:0)
我们可以假设所有数字都在[0, n - 1]
范围内(否则,我们可以'压缩'它们)。
让我们修复三元组中间元素的位置。现在我们可以计算左边更大元素的数量,并乘以右边较小元素的数量。
如何计算索引较小的较大元素的数量?这是一个解释它的伪代码:
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)
请注意,我们需要更新一个点和一个范围的总和。二进制索引树可以有效地完成它(它比段树更容易实现)。