【问题标题】:Queries to check whether all the elements in the given range occurs even number of times检查给定范围内的所有元素是否出现偶数次的查询
【发布时间】:2020-09-22 07:30:00
【问题描述】:

给定一个包含 N 个整数的数组 arr[],并且有 Q 个查询,其中每个查询由一个范围 [L, R] 组成。任务是查找给定索引范围内的所有元素是否具有均匀频率。

谁能给出比O(n * q)更好的解决方案。 此链接上给出的解决方案不正确。

https://www.geeksforgeeks.org/queries-to-check-whether-all-the-elements-in-the-given-index-range-occur-even-number-of-times/

示例如下:

Input: arr[] = {100, 100, 200, 100}, Q[][] = {{1, 4}, {1, 2}}
Output:
No
Yes 

Input: arr[] = {1, 1, 2, 2, 1}, Q[][] = {{1, 5}, {1, 4}, {3, 4}} 
Output: 
No
Yes
Yes

【问题讨论】:

  • 从您的链接中,是否有另一种解决方案?为什么发布这个问题
  • @Quade 因为它是错误的,例如 arr[] = {1,2,3} Q[][]= {{1,3}} 答案是否定的,但在 URL 中给出了算法输出是
  • 是的,你是对的,他们使用 xor 的方式似乎返回了误报。他们没想到 1 xor 2 xor 3 会等于 0
  • @Quade geeksforgeeks 总是错的,永远不要相信他们。

标签: algorithm data-structures


【解决方案1】:

解决方案 1:
您可以将每个值(映射)替换为大的随机值(例如 32 位)并使用您 url 中的算法。它将以足够高的概率起作用。

解决方案 2(无异或):
按对 (L_i / sqrt(n), R_i) 对所有查询进行排序。现在在查询(L_i, R_i)(L_{i+1}, R_{i+1}) 之间移动时需要添加/删除一些元素。我们逐个元素地进行以支持每个值的数量并计算不同组大小的数量。算法复杂度为O(Q * log Q + (N + Q) * sqrt N)

小解释:排序后加/删元素的总数操作等于和|L_i - L_{i + 1}| + |R_i - R_{i + 1}|
和差L:如果L_i / sqrt(n) = L_{i + 1} / sqrt(n)那么@ 987654327@(所有查询不超过Q * sqrt(n))。
如果L_i / sqrt(n) < L_{i + 1} / sqrt(n),那么我们转到下一个块sqrt(n),并且对其进行的总数操作不超过O(n)(因为L_i正在增加)。
和差R:如果L_i / sqrt(n) = L_{i + 1} / sqrt(n) 然后R_i 增加,总和|R_i - R_{i + 1}| 不超过O(n)。编号不同的sqrt(n) 块是n / sqrt(n) = sqrt(n)。然后总操作没有了O(n * sqrt(n)).
如果L_i / sqrt(n) < L_{i + 1} / sqrt(n)|R_i - R_{i + 1}|O(n),但此类情况的数量为n / sqrt(n) = sqrt(n)。总数为O(n * sqrt(n))

【讨论】:

  • 我能做到。但是你能给出不使用异或运算的解决方案吗?
  • @guptashekhar54 添加了没有异或。
  • 你能举个例子再解释一下你的解决方案2吗?排序时为什么我们将L_i 除以sqrt(n)
  • @guptashekhar54 添加了一些解释。
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2014-12-05
  • 1970-01-01
  • 2020-12-03
  • 2012-09-27
  • 2017-05-16
相关资源
最近更新 更多