我遇到了上面的SPOJ问题,我学习了Segment Tree,我试着理解它但我无法理解合并功能如何工作,
合并功能可以有三种可能性
然后我遇到了这个合并代码:
SegmentTree merge( SegmentTree a , SegmentTree b)
{
SegmentTree res ;
res.Sum = a.Sum + b.Sum ;
res.maxSum = max( max( a.maxSum , b.maxSum ) , (a.suffixSum + b.prefixSum ) ) ;
res.prefixSum = max( a.prefixSum , a.Sum + b.prefixSum );
res.suffixSum = max( b.suffixSum , b.Sum + a.suffixSum );
return res ;
}
跨越两个子间隔的序列,通过从右子女中的最大值中减去左子女的最小值获得 Statement Provided Here
请帮助我理解我无法理解的上述陈述prefix and suffix sum
请帮助我理解段树的合并功能
答案 0 :(得分:2)
假设我们有一个包含四个元素A,B,C,D的数组。
所以Segment树将它划分为这个结构:
Max(A,B,C,D)
/ \
Max(A,B) Max(C,D)
/ \ / \
A B C D
好的,对于Max(A,B,C,D),最大总和可以是Max(A,B)或Max(C,D)的最大总和(这很明显)< / p>
或者,如果A为负且D为负,而B和C不为,则最大总和可以是B + C或Max(A,B).suffixSum + Max(C,D).prefixSum
。
注意: 对于细分树中的node (L,R)
,后缀sum是从x开始并且以R <结尾的最大总和细分/ strong> L<= x <= R
,前缀sum是从L 开始并以x L<= x <= R
结束的最大总和段。
计算前缀和(后缀总和可以类似地完成):
例如,在节点Max(C,D)处,前缀sum将 Max of (prefix sum in node C, Sum of whole node C + prefix sum in node D)
。因为前缀sum必须在一端开始,所以它应该是第一个节点的前缀,或整个第一个节点加上第二个节点的前缀部分。
类似地,对于后缀sum,它将是Max of(节点D中的后缀sum,节点C的后缀sum +节点D的总和)。
希望它很清楚!