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