Editorial for COI '11 #2 Mjesec
Submitting an official solution before solving the problem yourself is a bannable offence.
The first thing we need to do is find the orientation of the robot. It can be done by issuing the command move L
, where is the total length of the track, calculated easily from input data. The command will cause the robot to complete one full circle along the track, counting each turn exactly once. Since the track is a polygon that doesn't intersect itself, it is easy to show that the number of left turns will be greater than the number of right turns if and only if the robot is moving counterclockwise.
The next step is moving the robot to some vertex (turn). It can be solved using binary search. Observe that, if the robot is currently at some position with distance exactly
to the closest vertex, then
is the smallest number such that
move Y
returns for all
and a value different from
for all
. It follows that we can find
by binary search, by following each
move Y
command (whose result we search over) by a move L-Y
command in order to return to position before the next iteration. After finding
, we simply execute
move X
, which is guaranteed to place the robot in some polygon vertex - we just don't know which one.
The last step is finding the exact vertex where we have moved the robot. In the beginning, all vertices are possible candidates for the robot's position. Now we need to find, for some two candidates and
, a number
such that the command
move Y
returns a different value depending on whether the robot is in or in
. Then, after executing
move Y
, we can eliminate at least one of the vertices as a possible candidate (perhaps even both). Then we can return to our starting vertex using the command move L-Y
and repeat the process until only one candidate vertex is left, giving us the exact position of the robot. Now we simply need to find a good value of for given vertices
and
: it can be done by simulation, walking along the track and constructing the sequence [segment_length, turn_orientation, segment_length, …] for one complete circuit around the track, with each of the two vertices as a starting position. The sequences for
and
must differ because the problem statement guarantees that a unique solution exists. The first difference between the two sequences gives us the needed value of
.
Since the first step uses command, the second at most
commands, and the third
commands, we are guaranteed to use less than
commands in total.
Comments