..

UOJ Round #22

A. 月球列车

30

$n, m \le 10^3$

暴力模拟。

时间复杂度 $\mathcal O(n m)$。

60

$n, m \le 10^5$

对于一次查询 $x$,依次考虑每一个二进制位是 $0$ 还是 $1$。

设 $a’{j,i} = a_i \& (2^{j + 1} - 1)$,对于每个 $i$,$a_i + x$ 的 $2^j$ 位是 $a_i \oplus x$ 的 $2^j$ 位再异或上 $a_i + x$ 的第 $j - 1$ 位是否进位,前者容易处理,后者等价于 $a’{j - 1, i} + (x \& (2^j - 1)) \ge 2^j$,所以求 $\bigoplus \limits_{i = 1}^n (a_i + x)$ 的 $2^j$ 位时只需求出有多少个 $a’_{j - 1,i} \ge 2^j - (x \& (2^j - 1))$,可以排序预处理后对每一位二分。

时间复杂度 $\mathcal O((n + m) \log n\log a_i)$。

90

$n, m \le 2.5 \times 10^5$
$t = 0$

排序预处理的部分可以利用上一次排序的结果,将新的一位为 $0$ 的部分和为 $1$ 的部分归并排序,使预处理复杂度降至 $\mathcal O(n \log a_i)$。

将查询离线,同样可以按上述方法将 $x$ 的前 $j - 1$ 位的顺序用 $\mathcal O(m \log a_i)$ 的复杂度求出,然后对于每一位,线性 Two Pointers 求出每个查询在这一位上的答案。

时间复杂度 $\mathcal O((n + m) \log a_i)$。

B. 月球铁轨

10

$n \le 10^3$

定义 $f(x, T) = \max_{y \in T} (x \oplus y), g(x, T) = \min_{y \in T} (x \oplus y)$,其中 $x$ 是一个数,$T$ 是一个 $\mathbb{F}_2$ 上的线性空间。

令 $c_i = a_i \oplus b_i(1 \le i \le n)$,对于区间 $[l, r]$,求出 $x_{l, r} = \oplus_{i = l}^{r} a_i$,再对 $c_l \cdots c_r$ 求出张出的线性空间 $T_{l, r}$,则答案为 $f(x_{l, r}, T_{l, r})$。

维护线性空间(可以维护一组基)以及求出 $f(x_{l, r}, T_{l, r})$ 的复杂度均为 $\mathcal O(m)$。

时间复杂度 $\mathcal O(n^2 m)$。

25

$a_i, b_i$($1 \le i \le n$)均在 $[0, 2^m)$ 范围内独立等概率随机。

如果一个区间的线性空间维数达到 $m$,这个区间的答案就是 $2^m - 1$。

随机数据下,维数小于 $m$ 的区间只有 $\mathcal O(n m)$ 个,求出这些区间的答案后使用经典算法求出第 $k$ 小。

时间复杂度 $\mathcal O(n m^2)$。

40

$a_i = b_i$($1 \le i \le n$)。

定义 $S_n = \oplus_{i = 1}^n a_i$,则 $x_{l, r} = S_r \oplus S_{l - 1}$。

一个区间的答案是 $S_r \oplus S_{l - 1}$,于是把所有前缀异或和插入一颗 TTie,然后 Trie 上二分即可求出第 $k$ 小的答案。

时间复杂度 $\mathcal O(n m)$。

55

$a_i = 0$($1 \le i \le n$)

区间 $[l, r]$ 答案是 $f(0, T_{l, r})$。

对于某个固定的 $l$,$T_{l, r}$ 最多只有 $m + 1$ 种,维数分别为 $0 \sim m$,并且如果区间 $A$ 包含区间 $B$,$T_A$ 包含 $T_B$。

使用扫描线算法,每次在序列末尾加入一个数 $S_r$,并且维护出每个左端点当前对应的线性空间。

加入一个数会使当前一个后缀的线性空间维数变大 $1$,维数变大总次数是 $\mathcal O(n m)$ 的,暴力维护即可。

时间复杂度 $\mathcal O(n m^2)$。

C. 月球车站

5

$a = 0$

伏特永远不会翻转,因此当且仅当初始硬币全为正面,答案为 0,否则 skip 蚤也选择不操作答案为 -1。

15

$b = 0$

伏特每次遇到背面的硬币都会将它翻转。

把同色的连续一些硬币称为一段。对于段数大于 $2$ 的局面,skip 蚤也只需要每次遇到正面的硬币都将它反转即可,容易发现这样即可让游戏无法结束。

当局面为全 0 或全 1,伏特显然获胜。

当局面为 00...011...1 时,显然伏特会获胜。

当局面为 11...100...0 时,伏特能否获胜与 1 的个数有关。

当仅有一个 1 时,不管 skip 蚤如何操作,都会变为上述伏特必胜局面,否则,skip 蚤不翻转第一个 1 ,即可使段数大于 $2$,于是游戏无法结束。

判断一下即可。