【问题标题】:Xor of numbers in a range范围内数字的异或
【发布时间】:2017-12-17 22:55:50
【问题描述】:

我刚刚遇到一个这样的问题

给定一个包含 n 个元素的数组,有 m 个类型为 l,r,t 的查询,其中程序中必须取出所有小于 t 且位于索引 l,r 之间的数字的异或(包含和 0 索引)。

示例: 说 arr={2,3,5,1} 我们的查询是:0 2 4 输出 1

我只能想到简单的解决方案,即遍历范围并仅对所有小于 t 的数字进行异或运算,但我只是想知道是否有任何数据结构(如段树)可以有效地完成任务?

【问题讨论】:

  • 是的。我认为 Segment tree 可以在这里工作。您可以参考此链接以获取有关类似问题的更多信息。它对 l,r 范围内的元素进行异或运算。我认为您的问题是同一问题的延伸。 geeksforgeeks.org/segment-tree-set-3-xor-given-range
  • 不知道你是否注意到,但我需要小于 t 的所有元素的异或
  • 是的。我认为我们可以在我提到的链接中应用 t 约束。我不确定,因为我仍在尝试使用您提到的 t 约束来做到这一点。会告诉你它是否真的可行。
  • 这个问题在过去几天出现过。绝对是在线比赛或家庭作业。

标签: data-structures xor xor-linkedlist


【解决方案1】:

这里有一个解决方案:

  1. 保存所有数字及其索引,并根据它们的值对它们进行排序(我们称之为数组a)。

  2. 先保存所有查询id为query的查询,按照t排序(暂且称其为数组q)。

  3. 采用一个分段树,其中每个节点默认包含 0。它是一个包含范围内异或的段树。

  4. 迭代 q 并将所有来自 a 的数字添加到段树中,对于每个查询小于 t 并在给定查询范围内取 xor 并使用查询 id 将其保存到数组中(让我们所有的一切)。

  5. 打印 ans 数组。

这个解决方案的复杂度是 O(nlog(n) + mlog(n))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多