邻位交换总结
给一个字符串
S ,每次操作可以交换相邻两个字符,求将S 转化至不含有子串\texttt{VK} 的最少操作次数。|S| \leq 75 。
如果你已经会了上面这一道题,那么你可以关掉这个页面了。这个页面就讲的这玩意,没什么。
顺便提一下,交换相邻两个元素,交换出所有排列的可达性可达性在树上也成立,具体题目可以看看 ARC107 C - Shuffle Permutation。这就是我要讲的了,会的可以关了。
题外话:所有排列的可达性
所有排列的可达性 对于任意一个
证明 只需证明我们可以交换任意两个元素,而保持其他元素不变即可。
不失一般性地,假设我们要交换
树上所有排列的可达性 对于一棵带点权树,点权为排列,如果可以交换相邻两个元素,那么我们可以交换出所有排列。
证明 同理。
具体题目可以看看 ARC107 C - Shuffle Permutation。
当然这是题外话了。我们今天要讲的是:邻位交换问题的最少操作次数。
从最简单的一道题讲起
给一个
n 个元素的序列\{A_n\} ,每次操作可以交换相邻两个元素,求将\{A_n\} 交换至不下降的最少操作次数。n \leq 10^6 ,1 \leq A_i \leq 10^9 。
相信大部分人应该都知道,答案就是逆序对数。为什么呢?给个证明。
证明
最少操作次数的下界 最少操作次数不小于逆序对数。
证明 可以发现,每次交换两个相邻元素,逆序对数会增加
最少操作次数的上界 最少操作次数不大于逆序对数。
证明 显然地,不存在
综上,最少操作次数等于逆序对数。
逆序对数可以通过各种方式
扩展一下
当然只是排序太没意思了,能不能扩展一下呢?
邻位交换定理 若已知交换后原来第
证明 同理。
同值顺序不变定理 若
证明 因为权值一样,所以交不交换
这两个定理非常非常重要,在类似的题目中经常出现。
NOIP2013 D1T2 火柴排队
link
给两个序列
\{A_n\}, \{B_n\} ,同序列元素互不相同。可以交换同序列中相邻元素,请使得\sum_{i = 1}^n (A_i - B_i)^2 最小,在此情况下的最少交换次数。
首先观察可以得到
注意到交换
时间复杂度:
POI2012 Letters
link
给定两个字符串
A, B ,可以交换A 中相邻两个元素,求让A 变为B 的最少次数。|A| = |B| \leq 10^6 。
和上面那道题是类似的,但是要注意:字符串中元素可能有重复的权值。
不过不难处理。根据同值顺序不变定理,如果有多个相同的权值,让位置小的和位置小的匹配即可,之后类似,不再赘述。
这一点要注意:同值相对顺序不变,这一点非常重要。之后如果出现了权值类似的情况,也可以根据这个来处理。
时间复杂度:
ARC097 E Sorted and Sorted
link
有
2n 个小球,小球有黑白两种颜色,每种颜色都有n 个,权值分别从1 到n 。可以交换相邻两个小球,请使得同色小球权值递增,并求出最少交换次数。
这一道题开始,我们就要引入用 DP 解决此类问题的经典做法了。
设
递推方面,可以考虑放入的是黑球还是白球。
- 如果序列末尾是权值为
i 的黑球,那么有F_{i, j} \leftarrow F_{i - 1, j} + B_{i, j} ,其中B_{i, j} 表示在权值为1 \ldots i 的黑球和权值为1 \ldots j 的白球中,有多少个球初始在权值为i 的黑球后面。- 解释:因为我们计算的是逆序对数,所以这里需要加上权值为
i 的黑球的贡献。注意到其他已经加入的球都在它前面,所以我们只需要知道有多少已经加入的球初始在权值为i 的黑球后面,就可以计算它的贡献了。
- 解释:因为我们计算的是逆序对数,所以这里需要加上权值为
- 白球同理。