【CF1338C】Perfect Triples【位运算】【构造】

传送门

题意:有一序列SS由下列方式生成:

  1. 找到字典序最小的正整数(a,b,c)(a,b,c),满足a,b,ca,b,c不在SS中且abc=0a\oplus b\oplus c=0,其中\oplus为异或
  2. a,b,ca,b,c加入SS
  3. 重复第一步

TT组数据,求SS的第nn项。

T105,n1016T\leq 10^5,n\leq10^{16}

通过观察样例和理性猜想,可以假设前4k14^k-1项恰好填完了14k11\sim4^k-1,显然这是整数个三元组。采用归纳法构造4k4k+114^k\sim 4^{k+1}-1

将每个序列中的数按二进制位两个为一组拆分(以下称拆成的两个二进制位为"位"),当前的数(已构造的和此步将构造的)有2(k+1)2(k+1)

之前填的4k14^k-1项可以看成最高位为00\texttt{00},我们要构造的是最高位为01,10,11\texttt{01,10,11},后面kk位分别遍历04k10\sim 4^k-1

对于每一个(a,b,c)(a,b,c)显然有a<b<ca<b<c

构造aa最高位为01\texttt{01},容易得到b,cb,c最高位为10,11\texttt{10,11}。这是最理想的结果,下面将证明这种构造是可行的。

现在已经满足了a<b<ca<b<c,那么a,b,ca,b,c的后kk位是互不影响的。下面讨论的都是这后kk位。

现在考虑如何最小化字典序

对于一个已经确定的aa,我们都需要找到最小的bb(废话)

对于aa上的每一位,都找到一个最小的对应的bb的位即可(似乎还是废话,但似乎就是想不到)

设新构造的三元组为(ai,bi,ci)(0i2k1)(a_i,b_i,c_i)(0\leq i\leq2^k-1)显然所有的ai=ia_i=i

根据以上信息可以构造出(a,b,c)(a,b,c)每一位字典序最小的对照表

盗用官方题解的图:

【CF1338C】Perfect Triples【位运算】【构造】
随便推一下就可以了

复杂度O(Tlogn)O(T\log n)