Editorial for DMOPC '20 Contest 6 P2 - Interpretive Art
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
The solution relies on 2 key observations.
- When we perform a brush stroke on a range, we can consider it as moving all of the
s to the left of the range and all of the
s to the right. This also means that
s can only move to the left, whereas
s can only move to the right.
- If we number the
s in
(first
, second
, third
, etc.), then their relative order never changes after any brush stroke.
The key idea now is that we must match the -th
in
with the
-th
in
. First, let us check for impossibility. There are 2 cases where it is impossible to turn
into
.
- If the number of
s in
is not equal to the number of
s in
.
- If the
-th
in
is to the left of the
-th
in
(since
s can only move to the left, these will never be matched).
All other cases are possible; we can simply spend brush stroke for each pair of
s in
and
and match them into the correct positions. We now provide an algorithm that uses the minimum possible number of brush strokes, assuming that it is possible to turn
into
:
Consider the first "chunk" of s in
, consisting of
consecutive
s. We can simply find the position of the
-th
in
, and use a brush stroke from index
to the position of the
-th
in
(unless the position of the
-th
in
is the same as the position of the
-th
in
, in which case this chunk is already matched). This will match the chunk of
s, as well as the following chunk of
s; if it didn't, then there would be a
in
where there should be a
, but since
s only move to the left and no more
s are needed on the left side, this contradicts the assumption of possibility. Also, note that any other combination of strokes that matches the first chunk of
s in
will result in the exact same arrays
and
, so
is definitely the optimal number of brush strokes if any are needed. Then, since the first chunk of
s and
s are matched, we can remove these chunks and restart the algorithm on the shortened arrays, where the proof of correctness is propagated.
That may sound like a mouthful, but it is really only there for logical rigour and a proof of optimality. The TL;DR is to just match every chunk of s in
with the correct number of
s in
from left to right.
Subtask 1
Simply simulating the algorithm above yields an or
solution, both of which are sufficient to pass this subtask.
Time Complexity: or
Subtask 2
A slightly optimized approach is required for this subtask. For example, one may store the index of the -th
in
for all
, and only consider using a brush stroke when encountering an index
such that
and
. There are, of course, a ton of other possible approaches as well.
Time Complexity:
Comments