考虑一个很简单的做法,对序列中元素进行二进制拆位分组,共分 \lceil \log_2 n \rceil 组,每组的一对集合按照二进制第 i 位分类.则可以证明,至少存在一组使得两个 y 恰好在一对集合中分开.然后分别对两个集合进行二分查找.即可找到两个 y 的下标.显然这种方式需要花费的次数为最多 \lceil \log_2 n \rceil + \lceil \log_2 \lfloor \frac n 2 \rfloor \rceil + \lceil \log_2 \lceil \frac n 2 \rceil \rceil 次.无法通过本题.
更进一步地,我们来分析二进制拆位的本质.当我们询问以第 i 位为依据拆出来的一对集合中的一个时,若得到的回答是包含奇数个 y,则表示两个 y 的下标的二进制表示中第 i 位取不同的值,否则代表这一位取相同的值.换句话说,我们可以在得到任意一个将两个 y 分开的集合对的同时得到两个 y 的下标的异或值.由于异或的逆运算还是异或,由此可以得出一个做法:当得到第一个 y 的下时,无需再对第二个 y 所在的集合进行二分查找,可以直接利用异或值与第一个 y 的下标计算.这种方式需要花费的次数为最多 \lceil \log_2 n \rceil + \lceil \log_2 \lfloor \frac n 2 \rfloor \rceil 次.可以通过本题.