找出是否可以进行排列

问题描述 投票:-1回答:1

给出从1到N的自然整数的排列,包括在内。最初,置换是1,2,3,...,N。我们还给出M对整数,其中第i个是(Li,Ri)。在一个回合中,我们可以选择这些对中的任何一对(比如使用索引j)并且任意地将从Lj到Rj的位置上的排列元素洗牌(包括位置是1)。我们不限制转数,您可以多次选择任何一对。

目标是获得给定的置换P.如果可能,输出“可能”,否则输出“不可能”。

示例:设N = 7且M = 4,数组为[3 1 2 4 5 7 6],查询为:

1 2
4 4
6 7
2 3

这里的答案是可能的。

algorithm permutation
1个回答
1
投票

将每对视为一个区间,计算union of intervals作为非重叠区间的列表,然后测试每个i,置换位置i的值是i还是与i处于相同的非重叠区间。

这是有效的,因为如果我们有a <= b <= c <= d(a, c)(b, d)对,那么通过反复调用(a, c)(b, d),我们可以获得(a, d)可以获得的任何排列。相反,(a, d)可以实现(a, c)(b, d)可以获得的任何排列。一旦对列表不重叠,很明显我们可以将元素i移动到位置j != i当且仅当ij处于相同的区间时。

© www.soinside.com 2019 - 2024. All rights reserved.