2023.8.23 SM Round 之 OI => IOI 反向复刻:算法竞赛打 APIO,就像模拟赛用 GJOJ

发布时间 2023-08-23 21:42:57作者: 音街ウナ

B

给定一棵树。多次询问 \(l_1,r_1,l_2,r_2\)

\[\operatorname{lca}([l_1,r_1],[l_2,r_2])=\bigoplus\limits_{u\in[l_1,r_1],v\in[l_2,r_2]}\operatorname{lca}(u,v) \]

\(n,q\le5\times10^4\)$

首先必须有一个在线 \(O(1)\) LCA。显然可以转化到 DFS 序上 RMQ。

换根 LCA 的 trick:

\[\operatorname{lca}_{rt}(u,v)=\operatorname{lca}(rt,u)\operatorname{xor}\operatorname{lca}(rt,v)\operatorname{xor}\operatorname{lca}(u,v) \]

显然左边一定与右边三项中的一个相等。分讨可证,另外两个总会是相同的值抵消。则可以固定根,问题转变为求:

\[\operatorname{lca}(rt,[l_1,r_1])\operatorname{xor}\operatorname{lca}(rt,[l_2,r_2])\operatorname{xor}\operatorname{lca}([l_1,r_1],[l_2,r_2]) \]

只需知如何解决最后一项。显然这个东西套路差分容斥,就是求:

\[\operatorname{lca}([1,x],[1,y]) \]

注意到求一段到另一段的贡献,套路分块,变成若干整块到前缀的贡献,做前缀和变为 整块前缀 到 任意前缀 的贡献。这样可以做到 \(O(nB)\) 时空预处理。散块的 \(\operatorname{lca}([bl_x,x],[1,y])\) 则可以同样容斥为 \(\operatorname{lca}([1,bl_y],[1,x])\operatorname{xor}\operatorname{lca}([1,bl_y],[1,bl_x))\)

只需处理 散块到散块 的贡献。这部分只好暴力变成 \(O(B^2)\),这样很明显 \(B=n^{1/3}\) 复杂度应该在 \(O(n^{5/3})\) 级别,但实际上询问用前缀和不需要遍历整块,这部分单次 \(O(B^2)\),而且很多层容斥常数巨大,所以 \(B\) 应该适当调小。

D

先简化问题,考虑 \(a_{i,j}=xy\) 的一个质因子 \(p\)。设 \(t_i=X_iY_i\),则最后要求 \(t[i]=1\)

发现当 \(p\) 分给 \(x\) 时有 \(t_i\gets t_i\cdot p,t_j\gets \dfrac{t_j}{d}\),分给 \(y\) 时有 \(t_i\gets \dfrac{t_i}{d},t_j\gets t_j\cdot p\)

\(p\) 看作一条连接 \(ij\) 的边,两种方案分别对应从 \(j\) 指向 \(i\) 和从 \(i\) 指向 \(j\)因为初始和最后均有 \(t_i=1\),即 \(t_i\)\(p\) 和除 \(p\) 的个数相同,对应到图上就是 入度等于出度。

将每个数分解质因数,对每种质因子 \(p\) 分别跑欧拉回路即可。