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