#CF1945E. 二分查找
二分查找
E. 二分查找
每个测试用例时间限制: 秒 每个测试用例内存限制: 兆字节
Anton 在徒步途中觉得无聊,想做点题。他问 Kirill 有没有新题,当然,Kirill 正好有一道。
给你一个长度为 的排列 ,以及一个需要查找的数 。 长度为 的排列是指一个包含 到 中所有不同整数的数组。例如 是排列,而 不是(数字 重复), 也不是( 但出现了 )。
你觉得自己是个高手,于是打算用一个高级算法来查找——二分查找。但你忘了一件事:使用二分查找要求数组必须是有序的。
你没有放弃,仍然决定直接使用这个算法。而为了让算法能得到正确结果,你可以在运行算法前执行至多 次如下操作: 选择下标 ()并交换位置 和 上的元素。
之后执行二分查找,算法流程如下: 一开始定义两个变量 ,。然后执行循环:
- 如果 ,结束循环;
- ;
- 如果 ,则令 ;
- 否则令 。
你的目标是:在运行算法前修改排列,使得算法结束后,有 。 题目保证使用不超过 次交换一定可以做到。
输入格式
输入包含多组测试用例。 第一行一个整数 ()—— 测试用例数量。
每组测试用例:
- 第一行两个整数 ()—— 排列长度与要查找的数 。
- 第二行 个整数,表示排列 。
保证所有测试用例的 之和不超过 。
输出格式
对于每组测试用例:
- 第一行输出一个整数 ()—— 交换次数。
- 接下来 行,每行两个整数 ,表示交换位置 和 。
你不需要最小化交换次数。
样例输入
5
6 3
1 2 3 4 5 6
6 5
3 1 6 5 2 4
5 1
3 5 4 2 1
6 3
4 3 1 5 2 6
3 2
3 2 1
样例输出
0
1
3 4
2
2 4
1 5
2
4 5
2 4
1
1 3