一次操作可以选择两个货位,若两处规格编号满足整除关系即可对调。若若干编号通过整除关系连成一条链,则同一连通块内的编号可以任意重排,不同连通块之间无法交换。
把出现过的规格编号看成点,若一个数整除另一个就连边。同一连通块内的货位可以任意填该块中的编号。为使整段规格序列字典序最小,每个连通块内:位置升序、数值升序,再一一回填。
数值范围 1≤ai≤n,按倍数枚举建边:对出现过的 x,枚举 2x,3x,…,若倍数也出现过则用并查集合并。
步骤:标记出现过的数;倍数枚举合并;按连通块收集下标与数值;块内排序后回填。
仓储系统把 n 个货位上的规格编号排成序列 a1,a2,…,an,每个编号满足 1≤ai≤n。调度规则允许:选择两个不同货位 i,j,若它们的规格存在整除关系(ai∣aj 或 aj∣ai),就可以把这两个位置上的编号对调。该操作可做任意次。仓管员希望在合法对调之后,得到字典序最小的规格序列并输出。
数组字典序:从左到右比较,在第一个不同位置上数值更小的一方更小。
约束:测试组数不超过 100000,单组 n 不超过 500000,所有组 n 之和不超过 1000000,且 1≤ai≤n。
每个测试文件包含多组数据。第一行一个整数 T,表示组数。 每组第一行一个整数 n,第二行 n 个整数 a1,a2,…,an。 保证 1≤T≤100000,1≤n≤500000,1≤ai≤n,且所有组 ∑n≤1000000。
对每组数据输出一行 n 个整数,表示操作后字典序最小的规格序列。
输入
2
4
4 1 3 2
7
5 7 1 3 6 2 4
输出
1 2 3 4
1 2 3 4 5 6 7
说明
第一组出现 1,2,3,4,它们处于同一整除连通块,按位置回填升序后得到 1 2 3 4。
第二组存在 1,它整除所有数,因此全部元素属于同一连通块,排序后得到 1 2 3 4 5 6 7。
输入
1
1
1
输出
1
说明
长度为 1,无需交换,输出 1。
输入
1
3
3 3 1
输出
1 3 3
说明
1 与 3 满足整除关系,同一连通块,排序后为 1 3 3。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.