SubArray中相等的元素

Equal elements in SubArray

本文关键字:元素 SubArray      更新时间:2023-10-16

我有一个包含N个元素的数组,我需要找到子数组中相等元素的索引之间的距离;我们将得到query (lr)的形式,其中L是子数组的起始索引,R是结束索引。总没有。数组元素的Q<=10^5和Queries Q<=10^5

,

7
0 4 0 8 0 32 0
2
0 2
0 5

//第一个查询的答案将是2(索引2-0)

//查询结果为8 (index (2-0) + (4-2) + (4-0))

编辑:我不期望代码(虽然它会很有帮助)一般的想法来解决将是一个很大的帮助。

这是一个sqrt分解的工作。

我们希望保持允许我们回答当前范围的状态,并将当前范围的端点向上或向下调整一个。为此,我们维护一个从元素到元素的映射(当前范围内该元素的所有索引的总和,当前范围内出现的次数)。我们也保持当前的答案。为了向下调整下端点以包含索引i处的元素x,我们通过范围- (x在范围* i中出现#次)中索引的总和来增加答案,然后增加总和和出现次数。其他三个操作类似。

为了实现sqrt分解,我们对查询进行排序(下端点层除以sqrt N,上端点)并按顺序调整范围。

创建一个映射,其键是数组的元素,值是它们出现的位置列表(您的示例将变为{0: [0, 2, 4, 6], 8: [3], 4: [1], 32: [5]})。这些群体形成了不相关的问题。找到答案的一种方法是将它们视为最大流量问题,其中每个索引形成两个顶点。每个索引都连接到它之后的所有索引,它之前的所有索引都连接到它。边的权重是数组中元素的距离,即两个索引之间的差。所有的"源"顶点都连接到一个无限的源,所有的"目标"顶点都连接到一个接收器。
所有问题的最大流值的和就是你要找的和。

作为一个例子,让我们使用项目0的索引:

           +-------- 0 ----------+      0 --------+
           |                     |                |
           |                     |                |
Source ----+-------- 2 -------+  +----> 2 --------+---- Sink
           |                  |  |                |
           |                  |  |                |
           +-------- 4 ----+  +--+----> 4 --------+
           |               |  |  |                |
           |               |  |  |                |
           +-------- 6     +--+--+----> 6 --------+

Weight of arc (u, v) = v - u

请注意,边的数量随着V^2的增长而增长,因为每条边都对应于为了计算结果而必须做的差异,即每个索引与其所有后继索引之间的差异。这使得解的复杂度为O(n^3)甚至比朴素算法更糟糕,这只是从另一个角度看问题的好方法:)