CF1168E

题意

给定\(K\)及长度为\(2^K\)的序列\(\{b_i\}\),找到两个\(0\sim 2^K-1\)的排列,是的按位异或后得到序列\(\{b_i\}\)或报告不存在。
\(K\le 12,0\le b_i\le 2^K-1\)

做法

\(\bigoplus\limits_{i=0}^{2^K-1}b_i\neq 0\),显然无解。

定义:令\(p_i\oplus q_i=a_i\)

考虑初始化两个排列为\(p_i=q_i=i\)
下面通过构造,证明可以实现任选两个位置\(i,j\),使得\(a_i\oplus x\rightarrow a_i,a_j\oplus x\rightarrow a_j\)

先令\(a_i=a_i\oplus x,a_j=a_j\oplus x\),但现在并不满足\(a_i\)的定义。

定义\(\text{fix(i,j)}\)为修正\(p_i,q_i,p_j,q_j\)使得满足\(p_i\oplus q_i=a_i\)\(q_j\oplus q_j=a_j\)

在修正过程中,我们始终要求\(p_i\oplus q_i\oplus a_i=p_j\oplus q_j\oplus a_j\),显然初始时是满足此条件的。

对于修正,先找到\(k\),使得\(p_k\oplus q_i=a_i\),由于序列\(\{p\}\)是一个排列,所以一定能找到。

  • \(k=i\),已经满足条件,修正完毕。
  • \(k=j\),那么将\((p_i,q_i,a_i),(p_j,q_j,a_j)\)修正为\((p_j,q_i,a_i),(p_i,q_j,a_j)\),满足条件,修正完毕
  • 否则
    \((p_k,q_k,a_k)\)
    \((p_i,q_i,a_i)\)
    \((p_j,q_j,a_j)\)
    将其修正为:
    \((p_i,q_j,a_k)\)
    \((p_k,q_i,a_i)\)
    \((p_j,q_k,a_j)\)
    现在\(i\)位置已满足\(a\)的定义,递归进行\(\text{fix(k,j)}\)操作。

我们下面证明这样修正的复杂度,是\(O(2^K)\)

证明:
考虑修正的过程,是\(\text{fix(a,j)}\rightarrow \text{fix(b,j)}\rightarrow \cdots\)
且在对应的三元组中,有部分位置是常数:\((p_i,?,?)(p_j,?,a_j)\)
我们下面证明,对于\(\text{fix(?,j)}\)的第一维,每个位置最多来一次。
假设某个时刻,得到了这样一个状态\(\text{fix(y,j)}\)
\((p_k,q_k,a_k)\)
\((p_i,q_x,a_y)\)(1)
\((p_j,q_y,a_j)\)(2)
(注意,我们暂时假设没有位置被重复遍历,所以那个(1)的\(a\)下标与(2)\(的q\)下标相同)
交换一次变成\(\text{fix(k,j)}\)
\((a_i,q_y,a_k)\)
\((p_k,q_x,a_y)\)
\((p_j,q_k,a_j)\)
在进行若干次操作后,来到状态\(\text{fix(n,j)}\)
\((p_k,q_x,a_y)\)
\((p_i,?,a_n)\)
\((p_j,q_n,a_j)\)
交换一次变成\(\text{fix(y,j)}\)
\((p_i,q_n,a_y)\)(3)
\((p_j,q_x,a_j)\)(4)
由(1)(2)得到\((p_i\oplus q_x\oplus a_y)\oplus (p_j\oplus q_y\oplus a_j)=0\)
由(3)(4)得到\((p_i\oplus q_n\oplus a_y)\oplus (p_j\oplus q_x\oplus q_j)=0\)
稍加化简,得到\(q_y=q_n\),由于\(\{q\}\)为排列,则\(y=n\),与事实矛盾。
看到这里,或许你会跟我有一样的感觉,就是如果是\(\text{fix(i,j)}\)重复遍历了会怎么样,那我们继续?
\((p_k,q_k,a_k)\)
\((p_i,q_i,a_i)\)
\((p_j,q_j,a_j)\)
变成
\((p_i,q_j,a_k)\)
\((p_k,q_i,a_i)\)(1)
\((p_j,q_k,a_j)\)(2)
经过若干次,到达这样一个状态
\((p_k,q_i,a_i)\)
\((p_i,?,a_n)\)
\((p_j,q_n,a_j)\)
交换变成
\((p_i,q_n,a_i)\)(3)
\((p_k,?,a_n)\)
\((p_j,q_i,a_j)\)(4)
然后这样问题出现了,由于\(\{q\}\)是个排列,显然得到\(n=j\),但这与事实矛盾。

最多进行\(O(2^K)\)次将两个位置\(i,j\)\(a_i,a_j\)同时异或上\(x\),便可以得到\(\{b\}\)
所以总复杂度为\(O(4^K)\)

posted @ 2021-03-02 18:46  Grice  阅读(128)  评论(0编辑  收藏  举报