Editorial for Balkan OI '11 P4 - Compare
Submitting an official solution before solving the problem yourself is a bannable offence.
There are several solutions for this problem. The best solution the Scientific Committee has uses , but we believe that is also achievable and deserves more than .
- A simple solution:
We consider a binary tree that has leaves.
: we set all the nodes from leaf "" to the root to .
: Our goal is to determine the lowest common ancestor (LCA) for leaf and leaf . Since the whole path from the root to the leaf is set to , we can do a binary search. Once we have the LCA we can return , or .
The next solutions use one-hot encoding.
This encoding uses bits for representing a number from to . For a given number , we only set the bit to and leave the rest set to . The advantage of this method is that we only need to write bit. While reading a value could take reads (we look for the bit set to ), comparing is a little faster. It takes reads. We only need to search from the current position to the closest end ( or ).
- Some tree solutions ():
We change the simple binary tree from the previous solution. We still have at least leaves, but the internal nodes will have a variable number of children. For instance let's assume that we have levels and the number of children for each level is , , , , and . We chose the degree for each level such that .
To encode a value in a node, we use the one-hot encoding.
Let's consider .
: we set all the nodes from leaf "" to the root to .
, since we have nodes and encoding takes bit_set()
call.
: Considering the same representation for again we look for LCA. However this time we do a top-down traversal. As soon as the bit we expect to be set to is , we try to determine if is higher or lower.
Worst case is when the last bit is not set to . In this case, we need to read an additional bit.
, since we have nodes and an additional bit_get()
.
- Further optimizations ():
For the previous solution, we observe that the worst case is achieved when we miss the bit in the last node.
If we choose then becomes . This solution also works if comparing a one-hot encoding is done in reads and not .
- Breaking the symmetry ():
Instead of levels for our tree, we chose levels of degree: .
becomes and becomes .
This solution uses the optimization.
For a given set of maximum branching factors, the formula for is:
num_levels + max(branching_factor_on_level[i]/2 + 1 + i for i in range(0, num_levels))
with product(branching_factor_on_level(i)) > 4095
- Mixed-radix
All the above tree solutions don't really need a tree. For instance, let's pick the solution above.
We can encode the value from the root in the bits from to , the value from the node on the second level in the memory from to and so on.
Comments