【问题标题】:Query Preprocessing查询预处理
【发布时间】:2014-03-10 13:01:49
【问题描述】:

我有 x 个整数数组,我需要回答 y 个查询。每个查询都有 3 个整数(数字、左索引、右索引)。我需要计算 GCD(Number, array[i])。 i 在查询中指定的左右范围内。现在我需要输出我在 GCD 计算中可以得到的最大数。

例子--> 假设数字是 4 5 8 查询-> (6,1,3)---(数字,左索引,右索引) GCD(6,4) = 2 GCD(6,5) = 1 GCD(6,8) = 2

所以答案是 2。如果数组中有 10^5 个元素并且我需要回答 10^5 个查询怎么办?

我正在考虑做一些预处理,但没有得到任何想法。

【问题讨论】:

  • 您拥有与查询相同数量的元素似乎很奇怪。查询是元素本身吗?至于处理上的帮助,就看你想要什么样的性能了。我会从分解你的所有元素开始。 GCD 可以看作是分解的多集交集。
  • 数组排序了吗?元素是否在“合理”范围内(上限)?
  • @Ante no 数组未排序
  • @Nuclearman 是的,我得到了分解部分,但我怎样才能更有效地回答查询?
  • 这当然是当前 Codechef 比赛的问题 ANUGCD。如果您环顾四周,就会有另一个问题询问相同的问题,并且对此有一些提示。一般提示是分段树可能会有所帮助,但为此目的构建分段树可能会很麻烦。

标签: math dynamic-programming mathematical-optimization


【解决方案1】:

可以为数组元素因式分解中的每个素数存储索引,对于查询数,请查看它在给定范围内的因式分解索引并找到它们之间的最大 GCD。

索引可以实现为具有对的列表(数组中的位置,素数),搜索段在日志中。

例如如果数组是 [4, 5, 8, 12, 3] 则我们有 3 个不同的素数 (2, 3, 5) 和索引:

2 -> [(0, 4), (2, 8), (3, 4)]
3 -> [(3, 3), (4, 3)]
5 -> [(1,5)]

对于查询 (6, 1, 3),由于 6=2*3 必须查看子索引:

2 -> [(2, 8), (3, 4)]
3 -> [(3, 3)]

通过这些子索引“并行”,并生成 GCD 的素数乘积(查询数和索引第二个元素中的最小素数幂)将产生所有可能的 GCD。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多