省选模拟赛 3.4
A
注意到 \(a[i]\) 可以异或上任意多次 \(a[1 \to i - 1]\),于是 求出 \(1\to i - 1\) 的线性基 \(V\),能变成数的个数是 \(2^{|V|}\)。
B
等价转换题,就是 \(mex = k\),意味着所有权值为 \(k\) 的覆盖了这条边。从小到大枚举权值,那么求出 \(val = k\) 的路径的交集,对交集的边进行一个答案的更新。
更新使用线性并查集,复杂度可以做到线性。
细节
- 求路径交集:取两两 LCA 中深度最小两个点。(路径的交还是路径) 当 \(p1 = p2\),有可能不存在交集,但是本题中不用讨论,因为这意味着边不交。
- 每个边覆盖一次,快速查找需要修改的边:维护一个并查集,每次修改一条边作用在儿子节点上,每次并查集合并儿子节点,于是每次只会修改一个连通块中深度最小的点,然后一直跳父亲直到深度 >= LCA 的深度。均摊线性复杂度。
C
给 \(a\) 序列分块,对于每个块统计他对原序列的贡献。散块暴力。
设 \(d_i\) 表示块中第 \(i\) 个数是啥,维护标记 \(c_i\) 表示 \(b\) 序列 \(i\) 位置开始平移过来了这个块。
那么 \(b_{i + j} = \sum c_i \cdot d_j\),使用 NTT 优化。
块长为 \(B\),则复杂度为 \(\mathcal{O}((n \log n + m) \dfrac{n}{B} + B\times m) = \mathcal{O(\sqrt {nm(n\log n +m))}}\)