Skip to main content

SPOJ - GSS1


Considering input series: { 4 , -10 , 3 , 100 , -20 , 1 }

Query(x,y) = Max { a[i]+a[i+1]+...+a[j] ; x ≤ i ≤ j ≤ y }


A node contains- 
[ START & END is a node's segment limit ]
Prefix is the maximum sum starting at START, end can be anywhere. There are two possibilities of the maximum. One, node's leftChild's prefix or two, adding leftChild's sum + rightChild's prefix. (which will make the prefix contiguous)
Suffix is the maximum sum ending at END, start can be anywhere.
There's two possibility of the maximum. One, node's rightChild's already calculated suffix or two, add rightChild's sum + leftChild's suffix (which will make the suffix contiguous).
Sum: leftChild's sum + rightChild's sum.
MAX Maximum of  - 
  • prefix (result is in the node, starts from START but doesn't end in END )
  • suffix  (result is in the node, doesn't start from START but surely ends in END )
  • leftChild's max ( result is in left child completely )
  • rightChild's max (result is in right child completely )
  • leftChild's suffix + rightChild's prefix ( result is in between leftChild & rightChild )
[ this explains why we need prefix,suffix in a node: to calculate MAX ]

Notice that, in last point, we can't add leftChild's Max + rightChild's Max because in some cases that would result in a non-contiguous MAX. 
Considering sub interval  4 -10  3
  • prefix = 4
  • suffix = 3
  • sum = -3
  • best = 4 

considering subinterval 100 -20   1
  • prefix =100    leftChild's prefix
  • suffix = 81     rightChild's sum + leftChild's suiffx 
  • sum =81
  • best = 100     prefix from above 
In query function, we'll build a node RESULT to return\.
finally, Query(x,y) = result.MAX ;








Comments

  1. you saved my day with clear explanation of prefix and suffix. _/\_

    ReplyDelete
  2. thanks buddy!
    you have made everything clear just in one post which I wasn't unable to find in about 10 different posts.
    :D

    ReplyDelete
  3. There is an error I guess,
    in third line of image
    tree[node].suf = max(tree[RIGHT].suf , tree[LEFT].suf+tree[RIGHT].sum)

    ReplyDelete
  4. In the picture , in node 1-2 , shouldn't the value be 4,-6,-6,4 ?

    ReplyDelete
  5. Can we do this using Binary Indexed Trees as well?

    ReplyDelete
  6. Amazing blog on this topic...
    Thanks man

    ReplyDelete
  7. In Image 1, Node 1 should store sum of range [1,6] which should be 78, But it is written -78.

    ReplyDelete
  8. In Image 1, Node 1 should store prefix sum of range [1,6] which should be 97, But it is written 78.
    Please correct me if I am wrong.

    ReplyDelete

Post a Comment

Popular posts from this blog

Minimum moves for balancing brackets

You’re given a non-empty string made in its entirety from opening and closing braces. Your task is to find the minimum number of “operations” needed to make the string stable. The definition of being stable is as follows: An empty string is stable. If S is stable, then {S} is also stable. If S and T are both stable, then ST (the concatenation of the two) is also stable. All of these strings are stable: {}, {}{}, and {{}{}}; But none of these: }{, {{}{, nor {}{. The only operation allowed on the string is to replace an opening brace with a closing brace, or visa-versa. Solution Heuristics: Traverse the string. When the number of opening braces( { ) matches the number of closing braces ( } ), the string is balanced. Else it's not balanced. So count both of them. Make a list. Insert only opening braces. If a closing brace is found delete one brace( if the size of the list is > 0 ) from the list. Because they would make a pair. If the list is empty then we'll conve...