Gcd和更新查询

时间:2015-02-07 13:14:44

标签: algorithm greatest-common-divisor

我有一系列数字A [0]到A [n-1]。

可能有2个可能的查询。

查询1:gcd i j:计算所有nos的gcd。 A [k]使得i <= k <= j。

查询2:更新i j:将A [i]更改为j

例如

gcd 2 4
gcd 1 5
update 2 3
gcd 2 4
update 4 1
gcd 3 6

执行此操作的最快算法是什么?

1 个答案:

答案 0 :(得分:0)

好问题,

首先想到的是使用分段树。如果您不熟悉分段树,这里是非常有用的教程。在每个节点上,我们可以在该节点覆盖的段中保留数字的gcd。因此,我们需要考虑每个更新查询的logn节点数,对于第二个查询,我们只能返回保存在根节点中的值。对于每个节点,我们需要计算其两个子值的gcd,因此更新查询需要O((logn)^ 2)时间,第二个查询需要O(1)时间。

以下是细分树的链接: https://www.topcoder.com/community/data-science/data-science-tutorials/range-minimum-query-and-lowest-common-ancestor/#Segment_Trees