CF1451E1&2 Bitwise Queries (Easy&Hard Version) 做题记录

Ridbit 有一个隐藏的长度为 nn 的数组 aa,Ashish 要去猜,nn22整数次幂。Ridbit 允许 Ashish 提出三种不同类型的查询。它们分别是:

  • AND i,ji,j:求元素 aia_iaja_j 每一位的 andand1i1≤i,jnj≤n,iji≠j

  • OR i,ji,j:求元素 aia_iaja_j 每一位的 oror1i1≤i,jnj≤n,iji≠j

  • XOR i,ji,j:求元素 aia_iaja_j 每一位的 xorxor1i1≤i,jnj≤n,iji≠j

限制:

  • Ashish 最多可以询问 n+1n + 1 次(Hard Version)n+2n+2 次(Easy Version)。
  • 0ain20 \le a_i \le n - 2

1n2161\le n\le 2^{16}

Easy Version

发现求出 a1a_1 就能通过异或求出剩下的数,那么考虑求 a1a_1

先用两次操作求出 a1a2=xor12a_1\oplus a_2=xor12a1&a2=and12a_1\&a_2=and12。显然对于某一个二进制位 ii,若 and12and12 的第 ii 位为 11a1a_1a2a_2 的第 ii 位也肯定为 11;若 xor12xor12 的第 ii 位为 11a1a_1a2a_2 之间肯定有且仅有 一个数第 ii 位为 11

考虑确定 xor12xor12 二进制中的 11 哪些属于 a1a_1,哪些属于 a2a_2。显然可以再用两次操作求出 a2a3=or23a_2|a_3=or23a1&a3=and13a_1\&a_3=and13。 对于某一个满足 xor12xor12 的第 ii 位为 11 的二进制位 ii,若 or23or23 的第 ii 位为 00,那么这个 11 显然属于 a1a_1;否则若 and13and13 的第 ii 位为 11 那么这一个 11 属于 a1a_1,否则这个 11 属于 a2a_2

这样我们就用 44 次操作求出了 a1a_1a2a_2,接下来用 n2n-2 次操作即可求出整个序列 aa,总共花费了 n+2n+2 次操作。

Hard Version

先对 2in2\le i\le nii 求出 bi=a1aib_i=a_1\oplus a_i,耗费 n1n-1 次操作。

然后考虑用 22 次操作求出 a1a_1

  • 显然若 bb 中有相同的元素或者存在 bi=0b_i=0 那么可以直接花费 11 次操作求出重复的元素,然后直接异或上 bib_i 求出 a1a_1
  • 否则此时 aa 中元素两两不同,那么显然一定有且仅有一个 bi=1b_i=1,也有且仅有一个 bj=2b_j=2,那么找出 i,ji,j,询问 a1&aia_1\& a_i 即可确定 a1a_1 二进制中除了最后一位的其它位,询问 a1&aja_1\&a_j 即可确定 a1a_1 二进制中的最后一位。