回答有关给定范围内不同数字数量的查询

Answer queries about the number of distinct numbers in a given range

问题

我有一个包含 N 个数字的数组。这些数字可能是不同的,也可能是无序的。我必须回答关于 A 和 B 之间有多少个不同数字的 Q 查询。其中 A、B 是 0 <= A <= B < array.Length.

之间的索引

我知道如何使用 HashTable 为每个查询执行 O(N),但我要求更有效的解决方案。 我试图用 sqrt 分解和线段树来改进它,但我做不到。我没有展示任何代码,因为我没有找到任何可行的想法。 我正在找人解释更快的解决方案。

更新

我读到您可以收集查询,然后使用二叉索引树 (BIT) 回答所有问题。有人可以解释如何去做。假设我知道 BIT 是如何工作的。

对于每个索引 i 找到具有相同值的前一个索引 prev[i](如果没有这样的索引则为 -1)。它可以通过从左到右 hash_map 平均 O(n) 来完成,然后索引范围 [l;r) 的答案是范围 [l;r 中的元素数 i ) 使得它们的值小于 l (这需要一些思考但应该清楚)

现在我们将解决数组 prev 上的问题 "given range [l;r) and value c find number of elements that are less then c"。如果我们在每个顶点中保存其范围(子树)中的所有数字,则可以使用线段树在 O(log^2) 中完成。 (在每个查询中,我们将获得 O(log n) 个顶点并在其中进行二分查找)