20230723练习总结
CF923D Picking Strings
当变化规则不好分析的时候可以考虑自己随便模拟一下变化过程,总结浓缩出一些等价且更简单的变化规则。
尝试推出几个比较简单的变化关系:
-
\(\texttt{B}\rightarrow\texttt{AC}\rightarrow\texttt{AAB}\rightarrow\texttt{AAAC}\rightarrow\texttt{C}\rightarrow\texttt{AB}\rightarrow\texttt{AAC}\rightarrow\texttt{AAAB}\rightarrow\texttt{B}\),这说明 \(\texttt{B}\) 和 \(\texttt{C}\) 是等价的。
-
\(\texttt{A}\rightarrow\texttt{BB}\),这说明 \(\texttt{A}\) 可以被替换为 \(\texttt{BB}\)。
-
\(\texttt{B}\rightarrow\texttt{AB}\rightarrow\texttt{AAB}\rightarrow\texttt{AAAB}\rightarrow\texttt{B}\),这说明 \(\texttt{B}\) 和 \(\texttt{AB}\) 等价,即一个 \(\texttt{B}\) 可以随意增减前面紧接着的 \(\texttt{A}\)。
现在有了三条简化的规则,就可以开始分析如何判断。
-
由规则 \(1\),可以将 \(S\) 和 \(T\) 中的 \(\texttt{C}\) 全部换成 \(\texttt{B}\)。变成了 \(A\) 和 \(B\) 组成的串。
-
由规则 \(3\),后缀的连续 \(\texttt{A}\) 无法增加,故 \(S\) 中的后缀连续 \(\texttt{A}\) 应该不多于 \(T\) 中的后缀连续 \(\texttt{A}\)。
-
如果 \(S\) 后缀的连续 \(\texttt{A}\) 和 \(T\) 的后缀连续 \(\texttt{A}\) 数量之差不是 \(3\) 的倍数,将多出的部分替换成 \(\texttt{BB}\)。
-
由规则 \(2\)、\(3\),\(\texttt{B}\) 会两个两个地增加或不变,故 \(S\) 中 \(\texttt{B}\) 的数量应该不多于 \(T\) 中 \(\texttt{B}\) 的数量,且差值为偶数。
-
如果 \(S\) 中全是 \(\texttt{A}\),\(T\) 中有 \(\texttt{B}\) 但后缀连续 \(\texttt{A}\) 的数量和 \(S\) 的长度相等则不行。
上文解法参考洛谷题解。
CF1661F Teleporters
这种题可以考虑从简单情况开始试着模拟一下,比如增加 \(1\) 个、增加 \(2\) 个,一个一个增加,分析代价减少规律。
如果在两个相邻的传送机之间增加传送机,那么肯定是间隔越平均越好。
在一个定长间隔 \(len\) 中增加传送机,假设增加了 \(k\) 个,这一段的代价应该为 \(len \bmod(k+1)\times\lceil\frac{len}{k+1}\rceil+(k+1-len\bmod (k+1))\times\lfloor\frac{len}{k+1}\rfloor\)。
感性理解一下,这个代价肯定在减少,但减少的速度会越来越慢。而在选择添加传送机的时候肯定是希望代价减少得越多越好,那么就会选择目前减少速度最快的添加。所以假想一下一个一个添加传送机的过程,应该是其中一些段的代价在最开始一直减少,然后当所有段减少速度差不多时开始几乎同步减少,减少得越来越慢。
于是我们可以二分一下这个过程停止的时间,也就是减少速度的下限,比如是 \(v\)。当所有段的减少速度都已经刚好不小于 \(v\) 时的总代价为 \(f(v)\),增加传送机数为 \(c(v)\)。那么想要找的应该是 \(f(v)\le m\) 的最大的 \(v\)。然而这可能还不是答案,因为可能有一些段的减少速度还并未减少到 \(v\) 时, \(f\) 值就已经 \(\le m\)。从 \(v+1\) 到 \(v\) 的每一个增加都会使代价减少 \(v\)。故答案为 \(c(v+1)+\lceil\frac{f(v+1)-m}{v}\rceil\)。
CF1687D Cute number
这种题应该采用数形结合的方式思考,将符合限制的数画出来找性质和规律
可爱的数可以写成一个集合 \(\{x|x\in[k^2,k^2+\frac{2k+1}2),x\in \mathbb{Z},k\in \mathbb{Z}\}\)。
显然可爱数使一段一段出现的,可以将 \(a_1\) 放在某一段的开头,然后整体向右挪动。如果一个数从可爱数变成了非可爱数,或从非可爱数变成了可爱数,就不会再变回去因为后面的区间会越来越大。
现在只需要保证原来是可爱数的一直是可爱数,原来不是可爱数的变成可爱数即可。求 \(k\) 的上下界可以预处理值域内每个数的前驱后缀,每段 \(O(1)\) 求出。\(a_1\) 的初始段直接枚举,总时间复杂度 \(O(VH(V))=O(V\log V)\)。