浅谈置换和典型题目
wallace_QwQ · · 算法·理论
一 从一道简单黄题开始:P5151
(1)题目大意:
给定一个置换排列
(2)前置知识:
现将序列每一位单独看成一个点。
如果若将原序列
如题目样例就会构成两个环:
这是很显然的,因为每一位的置换不会改变,所以只要一个元素第一次经过这一位后经
那么根据抽屉原理,一个元素最多经过
(3)解题方法(具体代码请去看题解):
- 方法一:暴力,找出每一个环的长度,对
k 进行取模即可,时间复杂度:\operatorname{O}(n) 。 - 方法二:快速幂,因为先置换
a+b 次再置换c 次和先置换a 次再置换b+c 次是一样,那么说明置换操作是满足结合律的,那么就可以仿照矩阵乘法一样,对置换序A ,进行一次快速幂,最后再对原序列进行一次置换即可,时间复杂度:\operatorname{O}(n \log k) 。 - 方法三:倍增,先对原序列进行一次置换,设
f[i][j] 为第i个元素置换2^j 次后的位置,那么易得公式f[i][j]=f[f[i][j-1]][j-1] ,再对k 进行二进制拆分,若k 在二进制下第i 位为1,说明需要进行2^i 次置换,直接调用即可,时间复杂度:\operatorname{O}(n \log k) 。
(4).相似题目
UVA306:相当于每一位映射一个字母,可以将上一题的原序列看成本题字符串的下标。
二 另一道特殊一点的黄题:AT_abc367_e
(1)特殊之处:
为什么说这道题特殊呢?注意到P5151中置换序列是一个排列,说明置换序列中没有重复元素,而UVA306题目中更是直接给了
含有
n 个不同整数的数列
那么为什么置换序列元素互不相同很重要呢?因为如果置换序列元素互不相同,而下标显然也一定互不相同,那么将每一个元素抽象成点,从下标到元素连一条有向边,每一个元素的出度和入度一定都为 1,所以所构成的图像一定为一个环。
而本题却没有这样的约束,这会导致每一个元素出度一定为 1,而入度不一定为 1,所以图会变成环和内向基环树的混合体。
如下图即为一棵内向基环树:
然而有的时候,根节点的子树会全部退化成一条链,这样的图往往会有一些更特殊的性质:
再如本题样例一构成的图:
最左边那个奇怪的东西也是基环内向树。
不过第一题的三种解决方案,方法二和方法三仍然是可以直接使用的,而方法一就需要特判以环为根的树,再取模。
(2).相似题目:
AT_abc167_d: 这道题样例中的基环内向树更典型一点:
三 进阶挑战:
- AT_abc387_f
题目大意:
给定正整数
N 、M 和长度为N 的序列A = (A_1, A_2, \dots, A_N) ,每个元素都是1 和N 之间的整数(含)。
求出长度为
- 对每个
i (1 \leq i \leq N ) 都有x_i \leq x_{A_i} 。
最终答案对998244353取模。
我们还是将序列
如样例三的图:
那么,我们只需构造出所有点权,使得
我们发现环上的点一定都是相同,那么考虑缩点,再树形DP一下就可以做出此题。
- AT_abc233_f
这道题又有所不同,令原排列为
四 一道黑题:AT_agc008_e
(以下图均来自官方题解,可以视为题解的补充)
直接从
首先,题目中说
否则,只有可能是
-
[ ] 与前面融合:
注意到每一个环可以旋转
i 次,融合有j-1 种选法:$f{i,j}=f{i,j}+f_{i,j-2}\times(j-1)\times i
- 考虑基环内向树,由于
p 一定为环,所以考虑将链条串连到环内,如下图:
-
[ ] 设链长为
l_1 ,两个链之间的距离为l_2 。若
l_1<l_2 ,有2种方案。若
l_1=l_2 ,有1种方案。若
l_1>l_2 ,无解。
- 最后按照乘法原理乘起来即可。
五 总结
本篇文章大致介绍了置换的典型问题和解决方法,共4道黄题和1道黑题,由于本蒟蒻水平有限,可能会有一定的疏漏,还请各位大佬批评指正。