您好我正在学习细分树。使用递归方法构建分段树对我来说很清楚,我已经实现了这样:
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]
但是这个逻辑如何帮助我构建分段树?一个简单的例子非常有用
答案 0 :(得分:0)
实际上有一个不同的&#34;功能&#34;代码中的build()及其代码。在您的代码中,当您构建分段树时,您还输入了叶子值,但在他们的代码中,他们在此语句中输入叶子值:
for (int i = 0; i < n; ++i) scanf("%d", t + n + i);
并使用build()仅填充其他节点