#CF1945E. 二分查找

二分查找

E. 二分查找

每个测试用例时间限制22每个测试用例内存限制256256 兆字节

Anton 在徒步途中觉得无聊,想做点题。他问 Kirill 有没有新题,当然,Kirill 正好有一道。

给你一个长度为 nn排列 pp,以及一个需要查找的数 xx。 长度为 nn 的排列是指一个包含 11nn 中所有不同整数的数组。例如 [2,3,1,5,4][2,3,1,5,4] 是排列,而 [1,2,2][1,2,2] 不是(数字 22 重复),[1,3,4][1,3,4] 也不是(n=3n=3 但出现了 44)。

你觉得自己是个高手,于是打算用一个高级算法来查找——二分查找。但你忘了一件事:使用二分查找要求数组必须是有序的。

你没有放弃,仍然决定直接使用这个算法。而为了让算法能得到正确结果,你可以在运行算法前执行至多 22如下操作: 选择下标 i,ji,j1i,jn1\le i,j\le n)并交换位置 iijj 上的元素。

之后执行二分查找,算法流程如下: 一开始定义两个变量 l=1l=1r=n+1r=n+1。然后执行循环:

  • 如果 rl=1r-l=1,结束循环;
  • m=l+r2m=\left\lfloor\dfrac{l+r}{2}\right\rfloor
  • 如果 pmxp_m\le x,则令 l=ml=m
  • 否则令 r=mr=m

你的目标是:在运行算法前修改排列,使得算法结束后,有 pl=xp_l=x。 题目保证使用不超过 22 次交换一定可以做到

输入格式

输入包含多组测试用例。 第一行一个整数 tt1t21041\le t\le 2\cdot 10^4)—— 测试用例数量。

每组测试用例:

  • 第一行两个整数 n,xn,x1xn21051\le x\le n\le 2\cdot 10^5)—— 排列长度与要查找的数 xx
  • 第二行 nn 个整数,表示排列 pp

保证所有测试用例的 nn 之和不超过 21052\cdot 10^5

输出格式

对于每组测试用例:

  • 第一行输出一个整数 kk0k20\le k\le 2)—— 交换次数。
  • 接下来 kk 行,每行两个整数 i,ji,j,表示交换位置 iijj

不需要最小化交换次数。

样例输入

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