做题记录 25.4.4

\(\textcolor{purple}\odot\) CF1949J Amanda the Amoeba

考虑在所有可能的状态中定义全序关系,令初始状态和最终状态都变换为可达的最小状态,若两者到达的不一样则显然互不可达,否则先从初始状态移到最小状态,再反向从最小状态移到最终状态(显然题目给出的变换可逆)

考虑对每个非障碍格子编号,定义一个状态之间的大小关系为状态中变形虫占据的格子的编号从小到大排序后得到序列的字典序大小关系

问题转化为找到一种合适的编号方法,和给定一个状态求出它能到达的最小状态(且要求操作次数不超过 \(2rc\) 次)

显然对于每一次操作,最优的方式为删除能删除的位置中编号最大的(若变形虫占据的每个格子为一个点,相邻的连边,则只能删除非割点对应的位置),然后放到能放置的位置中编号最小的(即变形虫周围一圈空地中编号最小的)

若任意编号,则可能出现变形虫卡在一个小数字聚集的角落的情况,因此考虑令编号为非障碍格子连通块的 \(\text{dfn}\),这样显然会向搜索树的根的方向聚集,不会出现上述情况

因此预处理编号后,每次用 \(\text{Tarjan}\) 求出能删除的点中编号最大的一个,将其删去后找到剩余部分周围一圈非障碍格子中编号最小的一个填上(若找到最大最小后统一操作,则可能出现连通块边缘的一个格子独自向外移动一格的不合法情况),若两者选择的格子相同则结束

可证明步数正确

时间复杂度 \(O((rc)^2)\)

代码

参考

\(\textcolor{blue}\odot\) CF1949G Scooter

显然一定不会改变当前状态和目标状态相同的格子,因此将其忽略

则剩下位置为 \(-\text M,-\text C,\text M-,\text C-,\text M\text C,\text C\text M\) 之一(第一个字符为目标状态,第二个字符为当前状态)

显然答案可分为若干段,每段中经过的路径为 \((-\text M)-(\text M\text C)-(\text C\text M)-\cdots -(\text M-)/(\text C-)\)\((-\text C)-(\text C\text M)-(\text M\text C)-\cdots -(\text M-)/(\text C-)\),以下称此为一段链

\(P(S)\) 表示状态 \(S\) 对应的下标集合,其中 \(S\in\{-\text M,-\text C,\text M-,\text C-,\text M\text C,\text C\text M\}\)

记录两个集合 \(B_1\)\(B_2\),分别表示 \(\cdots-(\text M-)\) 型的链的终点集合与 \(\cdots-(\text C-)\) 型的链的终点集合,每次从 \(B_1\)\(B_2\)(交替)中取出一个,将链延伸一个,然后加入另一个集合

最终把链尾加上

时间复杂度 \(O(n)\),注意边界情况的处理

代码

参考

\(\textcolor{blue}\odot\) CF1948F Rare Coins

\(S(x)\) 表示 \(x\) 个随机 \(0/1\) 变量的总和,则题目中一次询问 \(l,r\) 相当于求

\[E\left(\sum_{i=l}^r a_i+S\left(\sum_{i=l}^r b_i\right)>\sum_{i=1}^{l-1}a_i+\sum_{i=r+1}^n a_i+S\left(\sum_{i=1}^{l-1}b_i+\sum_{i=r+1}^nb_i\right)\right) \]

\(ia=\sum_{i=l}^r a_i,ib=\sum_{i=l}^r b_i,oa=\sum_{i=1}^{l-1}a_i+\sum_{i=r+1}^n a_i,ob=\sum_{i=1}^{l-1}b_i+\sum_{i=r+1}^nb_i\),则转化为求

\[\begin{aligned} &E(ia+S(ib)>oa+S(ob))\\ =&E(ia-oa+S(ib)-S(ob)>0)\\ =&E(ia-oa+S(ib)-ob+S(ob)>0)\\ =&E(S(ib)+S(ob)>oa+ob-ia)\\ =&E(S(ib+ob)>oa+ob-ia)\\ =&\sum_{i>oa+ob-ia}E(S(ib+ob)=i)\\ =&\sum_{i=oa+ob-ia+1}\binom{ib+ob}i \end{aligned} \]

预处理前缀和即可

时间复杂度 \(O(q+\sum b_i)\)

代码

参考

\(\textcolor{purple}\odot\) CF1946F Nobody is needed

\(f_{l,r}\) 表示 \([l,r]\) 中以 \(a_r\) 结尾的合法子序列数量

则询问 \(l,r\) 的答案为 \(\sum_{l\le k\le r}f_{l,k}\)

\(g_{l,r}\) 表示 \([l,r]\) 中以 \(a_l\) 开始以 \(a_r\) 结尾的合法子序列数量,则转移为

\[f_{l,r}=f_{l+1,r}+g_{l,r} \]

\[g_{l,r}=[l=r]+\sum_{l\le k<r,a_k\mid a_r}g_{l,k} \]

离线询问,对 \(l\) 扫描线,发现对于一个 \(l\),非零的 \(g_{l,r}\) 必须满足 \(a_l\mid a_r\),枚举 \(a_l\mid a_k\),然后枚举 \(a_k\mid a_r\),可 \(O(\frac n{a_l}\ln\frac n{a_l})\) 内求出有值的 \(g_{l,r}\)

树状数组维护 \(f_{\ast,r}\),每次暴力把 \(O(\frac n{a_l})\)\(g_{l,r}\) 累加到 \(f_{\ast,r}\)

左端点位于当前位置的询问可由树状数组直接回答

时间复杂度 \(O(\sum_{i=1}^n (\frac ni\ln\frac ni+\frac ni\log n)+q\log n)=O(n\log^2 n+q\log n)\)

代码

参考

posted @ 2025-04-05 07:46  Hstry  阅读(8)  评论(0)    收藏  举报