Editorial for DMOPC '21 Contest 1 P3 - Mystery DAG
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
This problem may seem intimidating at first, so let's identify some preliminary clues. First of all, note that the query limit of  is quite close to 
 with moderate overhead. If we recall algorithms which use 
 operations (e.g. merge sort), we may discover the possibility of a divide-and-conquer based approach being applied here.
Let's assume we have 2 disjoint graphs  and 
 such that both 
 and 
 are acyclic. Now, if we introduce some directed edges between 
 and 
, how can we ensure that the resulting graph is also acyclic? Well, we can simply direct all the edges such that they lead from 
 to 
! Bringing this back to the task at hand, if we query the set of nodes in 
 as set 
 and the set of nodes in 
 as 
, we can just flip the direction of all the edges at the returned indices to ensure that all edges between 
 and 
 lead from 
 to 
.
Now that we have a method to merge two DAGs into a single larger DAG, we can apply divide-and-conquer on the set of nodes to obtain a working solution using  operations.
Alternate Solution
We devise a solution that orients all the edges from a smaller number to a larger number, for which it is easy to show acyclicity using monovariants. Consider the binary representations of the numbers from  to 
. These can each be expressed in 
 bits. Furthermore, for each pair of numbers 
 in this range, they must differ in at least one of the 
 bits.
Now, for the -th of the 
 bits, let's make a query where a node belongs to set 
 if its number has the 
-th bit equal to 
, or it belongs to set 
 otherwise. Then, for each edge that goes from set 
 to set 
 or vice versa from the input, we flip it if it goes from a larger number to a smaller number (we can implicitly work out the orientations of these edges from the list of indices received from Siesta).
Since each pair  must differ by at least one bit, we know that we would have covered all possible pairs (and thus all possible edges) after the 
 queries. Since each query includes exactly 
 nodes, this solution also uses 
 operations.
Thanks to for discovering this solution.
Comments