段树的迭代代码

时间:2015-01-04 20:57:43

标签: c++ algorithm segment-tree

我想在c ++中编写段代码树并通过递归编写代码查询操作,但它很慢并且给出了TLE。所以,有人可以建议并通过迭代来解释下面的代码,这将是一个很大的帮助。谢谢。

以下代码计算范围内的gcd

int getgcd(vector<int> T, int ss,int se, int L, int R, int index)
{
if (L <= ss && R >= se)
      return T[index];
if (se < L || ss > R)
      return 0;
int mid = ((ss+se)>>1);
      return __gcd(getgcd(T, ss, mid, L, R, index<<1),getgcd(T, mid+1, se, L, R, (index<<1)+1));
}

在这里,

T - 细分树

ss - 分段开始

se -segment end

索引 - 分段树的当前节点

L - 下限查询

R -upper uery bound

2 个答案:

答案 0 :(得分:2)

按值传递矢量。每次调用此函数时都会复制它。因此,解决方案的时间复杂度为每个查询O(n * log n),而不是O(log n)。通过引用传递矢量应该修复它。

答案 1 :(得分:0)

如果您确实想重复执行此操作,请注意,它只是一个带有附加功能的DFS。 您可以使用堆栈轻松地执行迭代DFS。