给出从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
这里的答案是可能的。
答案 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 != i
和i
位于j
时,我们才能将元素{{1}}移动到位置{{1}}相同的间隔。