考虑对于每个 \(i\) 求出使 \([1,i]\) 全部排到 \([i+1,n]\) 之前的最小操作次数。将 \(\le i\) 的数视为 \(0\),\(>i\) 的数视为 \(1\),根据操作的顺序,位置差较大的 \((1,0)\) 有序对会优先被交换。
也就是说,每次只可能将最左边的 \(1\) 和最右边的 \(0\) 交换。找到位置 \(\le i\) 的最靠右的 \(1\) 和位置 \(>i\) 的最靠左的 \(0\),答案即为这些位置差的最小值。直接对每个 \(i\) 暴力往左右扫可以获得 \(\tt 50\) 分。用树状数组 \(\mathcal O(n\log n)\) 维护常数较小,可以获得 \(\tt 100\) 分。
发现当 \(i\) 增大 \(1\) 或减小 \(1\) 时,左右第一个 \(1,0\) 的位置最多只会移动一位,直接扫描线求即可,时间复杂度 \(\mathcal O(n)\)。