给出从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
这里的答案是可能的。
将每对视为一个区间,计算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
处于相同的区间时。