问题 5868 --k步排序

5868: k步排序★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 48  解决: 24
[提交][状态][命题人:]

题目描述

现有一个由1nn个整数构成的序列p(每个数有且仅有1个)和一个整数k,规定pn个元素为p1,p2,……,pn, 你需要按照升序对这个序列进行排序(即最终将序列转换为:123……n)。为此,你可以执行下列操作若干次(可以为0次)完成排序(我们也称其为”k步排序”)

(1) 从序列中任意选择两个元素pipj,确保|ij|=k,交换pipj的值。

不幸的是,有些序列无法用固定的k完成最终排序。比如:当序列为:[2,4,3,1]k=2时,我们就无法按照上述操作完成排序,将序列转换为递增序列。

为了利用上述操作完成最终排序,你可以在排序之前在序列中任意选择两个元素pipj(此时,不要求|ij|=k),并交换它们,我们将这种操作称为“预交换”操作。

你的任务是:

(1)     确定所给序列是否可以不经过“预交换”操作,仅采用k步排序实现序列排序;

(2)     如果无法实现,是否可以只经过一次“预交换”操作,然后采用k步排序实现序列排序。

    比如:当k=2,序列为:[2,4,3,1]时,可以先执行一次“预交换“操作,交换p1p4的值,将序列转换为:[1,4,3,2], 然后采用k步排序:i=2,j=4 (此时|2−4|=2),将序列转为为:[1,2,3,4],此时序列已经递增有序;

输入

第一行只有一个整数t(1≤t≤10000):测试用例的数量。

接下来共2t行,每个测试用例2行:

第一行两个整数nk2≤n≤2e51≤k≤n-1)n为序列长度,k为可以交换的两个序列元素之间的距离。

第二行共n个整数p1,p2,p3,……pi,……,pn1≤pi≤n ):序列中n个元素的值。

输出:

输出

t行,每个测试用例一行一个整数:01-1

(1) 如果可以不执行“预交换“操作,仅通过执行k步排序完成序列的排序,则输出:0

(2) 如果可以执行1次“预交换“操作,再通过执行k步排序完成序列排序,则输出:1

      (3) 否则,输出:-1
样例输入
Copy
6
4 1
3 1 2 4
4 2
3 4 1 2
4 2
3 1 4 2
10 3
4 5 9 1 8 6 10 2 3 7
10 3
4 6 9 1 8 5 10 2 3 7
10 3
4 6 9 1 8 5 10 3 2 7
样例输出
Copy
0
0
1
0
1
-1

提示

来源

 

[提交][状态]