找出是否可以进行排列

时间:2014-08-24 16:41:35

标签: algorithm permutation

给出从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

这里的答案是可能的。

1 个答案:

答案 0 :(得分: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 != ii位于j时,我们才能将元素{{1}}移动到位置{{1}}相同的间隔。