A 3log Method for Finding Depths

Revision en2, by _paper_, 2026-05-15 17:03:20

Here is a method to find the depth of every node in $$$3\log n$$$ operations.

Root the tree at $$$1$$$, and let $$$dep_1=0$$$.

Take a power of two $$$D$$$ such that $$$D\ge n$$$. Since the depth of any node in the tree is less than $$$n$$$, initially we can assume that the depth of every non-root node lies in $$$[1,D]$$$.

Then we keep binary-splitting this interval.

Suppose that currently every node belongs to a depth segment of length $$$len$$$. For a node $$$u$$$, let $$$id_u$$$ be the index of the segment it currently belongs to, that is:

$$$ dep_u\in[id_u len+1,(id_u+1)len] $$$

In each binary-splitting round, we want to determine whether each node is in the left half or the right half of its current segment.

Consider processing all segments in parallel by grouping their indices modulo $$$3$$$.

For $$$r=0,1,2$$$, we make one query:

  • if $$$id_u\equiv r\pmod 3$$$, set $$$d_u=\frac{len}{2}$$$;
  • otherwise, set $$$d_u=0$$$.

This query can split all nodes satisfying $$$id_u\equiv r+1\pmod 3$$$.

Consider a node $$$x$$$ whose side we want to determine, and suppose the index of its segment is $$$id$$$. The only nodes that can actually affect it are those in the previous segment $$$id-1$$$.

All other selected segments are at least two full depth segments away from the segment of $$$x$$$, so their distance to $$$x$$$ must be greater than $$$mid$$$, and they will not light up $$$x$$$.

Therefore:

  • if $$$x$$$ is in the left half of its current segment, then after moving $$$mid$$$ steps towards the root, it reaches the previous segment, so it will be lit up;
  • if $$$x$$$ is in the right half of its current segment, then its distance to every node in the previous segment is greater than $$$mid$$$, so it will not be lit up.

Thus, from the query result, we can directly determine which half $$$x$$$ should enter.

There is also the case $$$id=0$$$: the first segment has no previous segment, so we additionally need to set $$$d_1=mid$$$ for the root.

Each round only needs $$$3$$$ queries, and there are $$$\log D$$$ rounds. Therefore, the number of queries needed to find all depths is at most: $$$3\log_2 1024=30$$$.

In fact, with some small optimizations, the number of queries can be reduced by a few more. Also, this method is more consistent with the official editorial's method for finding the parent of each node.

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en4 English _paper_ 2026-05-15 17:06:07 12
en3 English _paper_ 2026-05-15 17:05:01 34
en2 English _paper_ 2026-05-15 17:03:20 180
en1 English _paper_ 2026-05-15 17:01:59 2474 Initial revision (published)