分段树构建方法

时间:2016-02-22 15:35:15

标签: c++ segment-tree

您好我正在学习细分树。使用递归方法构建分段树对我来说很清楚,我已经实现了这样:

void build( int n, int b, int e){
    if(b > e) return;
    else if (b == e) { tree[n] = arr[b]; return }
    build(n*2 , b , (b+e)/2 );
    build(n*2+1 , (b+e)/2+1 , e );
    tree[n] =  tree[n*2] + tree[n*2 + 1] ;
}

但是我看到了像这样的镜头实现:

    void build() {  // build the tree
      for (int i = n - 1; i > 0; --i) t[i] = t[i<<1] + t[i<<1|1];
   }

i understand that t[i<<1] is same as  t[2*i] and t[i<<1|1] is same as t[2*i+1]

但是这个逻辑如何帮助我构建分段树?一个简单的例子非常有用

1 个答案:

答案 0 :(得分:0)

实际上有一个不同的&#34;功能&#34;代码中的build()及其代码。在您的代码中,当您构建分段树时,您还输入了叶子值,但在他们的代码中,他们在此语句中输入叶子值:

for (int i = 0; i < n; ++i) scanf("%d", t + n + i);

并使用build()仅填充其他节点