2021.12.30 模拟赛
才想起来去年有一场模拟赛没补。
「LibreOJ NOI Round #2」单枪匹马
过程中是不需要约分的:已经得到最简分数 \(\frac{x}{y}\),那么 \(a_i+\frac{y}{x}=\frac{a_ix+y}{x}\) 分子分母的 \(\gcd\) 依然为 \(1\)。
运算过程可以写成矩阵转移,线段树维护,或者直接维护矩阵 \(A\) 和 \(A^{-1}\) 前缀积(注意顺序)。
「ZJOI2020」传统艺能
考虑每个节点的贡献。
标记的下传过程是线段树以根为起点的一条路径,也就是只需要考虑每个节点的所有祖先是否有标记。
可以 DP \(f_u(i,0/1,0/1)\) 表示 \(u\) 节点在第 \(i\) 次操作后 \(u\) 祖先是否有标记、\(u\) 是否有标记,的方案数。转移就是大量分类讨论,具体见代码。然后写成矩阵转移,快速幂即可。
根需要特殊考虑。
「LibreOJ NOI Round #1」北校门外的回忆
规律:
- 如果 \(K\) 是奇数,每个数 \(x\) 向 \(x+\mathrm{lowbit}(x)\) 连边,会形成若干条链;如果 \(K\) 是偶数,\(+\mathrm{lowbit}\) 的过程可能会变成 \(0\),链的底部会分叉。
- \(+\mathrm{lowbit}\) 其实就是最低的非零位 \(\bmod K\) 意义下乘 \(2\)。
设 \(r\) 为 \(x\) 的最低非 \(0\) 位,\(r=2^{l_r}c_r,K=2^{l_K}c_K\)。
当 \(l_r< l_K\) 时,\(r\to 2r\bmod K\) 的路径是 \(\rho\) 形环,\(x\to x+\mathrm{lowbit(x)}\) 的路径是一颗树;
当 \(l_r\ge l_K\) 时,\(r\to 2r\bmod K\) 的路径是环,\(x\to x+\mathrm{lowbit(x)}\) 的路径是一条链。
\(l_r< l_K\) 考虑暴力跳,不超过 \(\log K\) 次 \(x\) 就能跳到链上。每条链用数据结构维护修改查询。
如何找到所在链?链的最小数可以唯一地表示这条链,这样的数 \(s\) 满足 \(l_{r_s}\ge l_K\) 并且 \(s\) 除了最低非 \(0\) 位以外是极小的。
一种方法是倍增去找,但是这里我们不倍增,学习了一下 EI 在 loj 上的最优解代码,利用 \(r\) 有循环节的特点。
设 \(r\) 所在环为 \(C\),\(C\) 一圈产生的进位为 \(\mathrm{period}_C\)。我们先跳到环的起点(最小数),然后每次跳一整个环,也就是 \(\bmod \mathrm{period}_C\)。剩余的部分已经可以唯一确定链的开头了,不必具体确定是哪一个数。
复杂度 \(\mathcal O(Q(\log_2K\log_Kn+\log Q))\)。