CF1364E X-OR
题目链接:CF1364E
有一个固定的长度为 $n$ 的排列 $P$,其值域为 $[0,n-1]$,你可以进行不超过 $4269$ 次询问,之后你需要输出这个排列 $P$。
你可以按照 ? a b
的格式进行询问,之后你会得到 $P_a$ 与 $P_b$ 的按位或。
保证 $3\le n\le 2048$,$0\le P_i\le n-1$。
Tutorial
首先发现如果找到 $0$ 的位置,其他的全部问一遍就都出来了,因此转化为如何找 $0$。
不妨先随机两个位置 $x,y$,再枚举其他所有 $i$:
- $P_x P_y > P_y P_i$:$P_x$ 必然非 $0$,因此用 $i$ 代替 $x$ 继续循环。
- $P_xP_y = P_yP_i$:$P_y$ 必然非 $0$,因此用 $i$ 代替 $y$ 继续循环。
- $P_xP_y <P_yP_i$:$P_i$ 必然非 $0$,因此不换。
那么最后肯定剩下 $x,y$,其中一个必为 $0$。
于是我们可以再随机一个数 $i$:
- $P_x P_i > P_yP_i$:$P_x$ 必然非 $0$,因此 $P_y=0$。
- $P_xP_i < P_yP_i$:$P_y$ 必然非 $0$,因此 $P_x=0$。
- $P_xP_i = P_yP_i$:分辨不出来啥再重新随一个:(
简单分析一下询问次数:
首先第一部分找到两个中必有 $0$ 的一对数字,扫了一次所有的点,而其中第二种情况需要多询问一次新的 $P_xP_i$的值(为下次循环做准备),而产生第二种情况的充要条件是 $P_x \& P_y = P_x,P_i\& P_y = P_i$,其概率可以估计为 $\sum_{i=1}^n\frac 1{n^3} 2^{2\operatorname{popcount}(i)}\approx 0.0056843422353267669677734375$,可以看出这是非常小的。
因此这部分的询问次数大约为 $0.0056843422353267669677734375\times 2048+2048\approx 2059$。
其次第二部分随到第三种情况的概率:$\sum_{i=1}^n \frac 1{n^2}2^{\operatorname{popcount}(i)}\approx 0.04223537445068359375$。
不妨设其期望次数为 $f$,则有 $f=0.04223537445068359375\times (f+1) +(1-0.04223537445068359375)\times 1$
因此 $f=1.0441$。
所以总询问次数期望为:$2059+1+2048=4108$,远远小于 $4269$。
Solution
1 |
|