段树的合并功能

时间:2015-01-12 08:12:46

标签: algorithm tree

Problem

我遇到了上面的SPOJ问题,我学习了Segment Tree,我试着理解它但我无法理解合并功能如何工作,

合并功能可以有三种可能性

  1. 最大总和位于左侧节点
  2. 最大总和位于正确的节点
  3. 最大总和在左右节点之间。
  4. 然后我遇到了这个合并代码:

    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 请帮助我理解段树的合并功能

1 个答案:

答案 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的总和)。

希望它很清楚!