COMPRBLEGRID Editorial

DIFFICULTY:

3422

Let’s see how the optimal sequence of operations for a given string S may look like. Let’s call the operation of swapping two integers in the same column vertical, and the operation of swapping two integers in the same row horizontal. Consider also a graph on n nodes, and connect i and i+1 with a node if we made at least one horizontal swap between columns i, i+1. Consider the connected components of this graph. Note that all components are independent from each other: there is no exchange of elements between different components.

Let [l, r] be one of these components

Clearly, we made at least r - l horizontal swaps for this component to appear. Note, however, that we can “fix” the component with at most r - l + 1 vertical operations alone. More specifically, we can fix it in x vertical operation, where x is the number of positions where A_{1, i} and A_{2, i} are out of order. So, if x \le r - l, we can just make the vertical fixes instead of horizontal ones. Otherwise, assume that x = r - l + 1, so all positions in this component are out of order. To do better than this, our only choice is to do exactly r - l swaps, and all of them will be horizontal, to produce this component.

So now, we need to be able to determine for a segment [l, r], in which all positions are out of order, if we can “fix” it by doing r - l horizontal operations, between (i, i+1) for each l \le i < r. How to do this? We can do this with O(n^5) dp, where the state is (l, r, the current state of the leftmost column, the current state of the rightmost column) (note that there are O(n) of each state, as at most one cell will be touched. For such a state, we will keep YES or NO: can we fix it in r-l operations. Transitions are clear: we will try each l \le i < r, and each row (first or second) for a swap, and see if it’s possible to transform the left and the right sides separately.

After we calculated this dp, we found for each segment [l, r], if it’s possible to fix it with r - l horizontal operations when initially all the positions in it are out of order, let’s call segments which we can fix this way good. Then, we are able to find the general answer for each consecutive segment of positions out of order: just find the maximum number of good segments we can split them into.

End the solution by counting the contribution of each segment: for each segment [l, r], count the number of strings in which it will have all positions out of order, and positions to the left and to the right will be absent or in order. Multiply by the answer for this segment. The sum of these values over all the segments is the answer we need.