CF1945E.Binary Search
普及+/提高
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Anton 在徒步旅行时感到无聊,想要解一道题。他问 Kirill 有没有新题,Kirill 当然有。
你得到了一个长度为 n 的排列 p,以及一个需要查找的数字 x。长度为 n 的排列是一个包含 1 到 n 的 n 个互不相同整数的数组,顺序任意。例如,[2,3,1,5,4] 是一个排列,但 [1,2,2] 不是排列(2 在数组中出现了两次),[1,3,4] 也不是排列(n=3 但数组中有 4)。
你自认为是个很酷的程序员,所以你打算用高级算法——二分查找来查找 x。但你忘了二分查找需要数组有序。
你没有放弃,决定无论如何都要用这个算法。为了得到正确答案,你可以在运行算法前,最多进行 2 次操作:每次选择下标 i、j(1≤i,j≤n),交换第 i 个和第 j 个位置上的元素。
之后,执行如下的二分查找算法。算法开始时,声明两个变量 l=1,r=n+1。然后执行如下循环:
- 如果 r−l=1,结束循环。
- m=⌊2r+l⌋。
- 如果 pm≤x,则令 l=m,否则令 r=m。
你的目标是在算法开始前重新排列数组,使得算法结束后 pl=x。可以证明,最多 2 次操作总是足够的。
输入格式
每个测试点包含多组测试数据。第一行包含一个整数 t(1≤t≤2⋅104),表示测试数据组数。接下来是每组测试数据的描述。
每组测试数据的第一行包含两个整数 n 和 x(1≤x≤n≤2⋅105),分别表示排列的长度和要查找的数字。
第二行包含排列 p,用空格隔开(1≤pi≤n)。
保证所有测试数据中 n 的总和不超过 2⋅105。
输出格式
对于每组测试数据,第一行输出一个整数 k(0≤k≤2),表示你进行了多少次操作。接下来的 k 行,每行输出两个整数 i、j(1≤i,j≤n),表示你交换了第 i 个和第 j 个位置上的元素。
注意,你不需要最小化操作次数。
输入输出样例
输入#1
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
输出#1
0 1 3 4 2 2 4 1 5 2 4 5 2 4 1 1 3
说明/提示
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?