我们可以从一个排列计算其开普勒表示,由排列a1,2,...,n计算其开普勒表示K1,2,...,n,方法如下:
建立n个带编号的点,编号为1,2,...,n,初始没有边。
连有向边i → ai,i ∈ [1,n]。
由于a是一个排列,那么这个有向图必然由若干个有向圈构成,注意这里圈长可能为1,即可能出现自环。
对每个圈,从任意一个点出发,沿着边方向,遍历一遍(不重复访问点),按照顺序写下访问到的点编号,并加括号,如:(2,5,3,4,9)表示一个圈2 → 5 → 3 → 4 → 9 → 2,当然表示不唯一,例如(3,4,9,2,5)。
将所有圈的表示放在一起,此时圈与圈的相对顺序可以任意,例如:(7,8,10,9)(1,5,3)(4,2)(6)
将每个圈旋转到以圈内最大值开头,例如:(10,9,7,8)(5,3,1)(4,2)(6)。
确定圈与圈之间的顺序,以圈内最大值为关键字,从小到大排列:(4,2)(5,3,1)(6)(10,9,7,8)
去掉括号,得到开普勒表示:4 2 5 3 1 6 10 9 7 8。
多组测试数据,每组测试数据中:
第一行包含一个整数op。
第二行包含一个整数n,1<= n <= 2 * 10^6。
第三行包含n个数,表示1到n的排列。
op=1时读入一个排列表示a。
op=2时读入一个排列表示K。
对于每组测试数据:
op=1时输出一行表示K。
op=2时输出一行表示排列a,不存在输出-1。
1 10 9 10 5 7 2 4 1 8 6 3
8 9 6 4 7 1 10 3 5 2