【比赛记录】 AtCoder Beginner Contest #272
Problems:
# | Name | Submit |
---|---|---|
A | Integer Sum | ![]() |
B | Everyone is Friends | ![]() |
C | Max Even | ![]() |
D | Root M Leaper | ![]() |
E | Add and Mex | ![]() |
F | Two Strings | ![]() |
G | Yet Another mod M | ![]() |
Ex | Flipping Coins 2 | ![]() |
题解:
A: Integer Sum
求和。
B: Everyone is Friends
暴力判断任意两个人是否至少参加了同一个聚会。
C: Max Even
分奇数和偶数计算。
D: Root M Leaper
BFS
搜索,对于点 \((i,j)\) ,枚举 \(k\) ,计算对应的 \(l\) ,然后拓展。
E: Add and Mex
首先发现 \(\text{mex}\in[0,n)\) 。
设操作次数为 \(k\) ,则只需要考虑满足 \(0\leqslant a_i+i\times k<n\) 的 \(k\) 。
粗略估计时间复杂度:
- 对于 \(i<\sqrt{n}\) ,次数在 \(\text{O(}\) \(n\) \(\text{)}\) 级别。
- 对于 \(i>\sqrt{n}\) ,次数在 \(\text{O(}\)\(\sqrt{n}\) \(\text{)}\) 级别。
故总次数在 \(\text{O(}\) \(n\sqrt{n}\) \(\text{)}\) 级别。
精确一点就是调和级数,\(\text{O(}\) \(n\log n\) \(\text{)}\) 级别。
对于 \(i\in[1,m]\) ,遍历对应次数的值即可找到 \(\text{mex}\)。
还有一种找 \(\text{mex}\) 的写法,遍历次数仍是 \(\text{O(}\) \(n\log n\) \(\text{)}\) ,
由于 lower_bound
的存在,复杂度再多乘一个 \(\log(n)\)。
F: Two Strings
通过重复拼接字符串的方式,将 \(S\) 和 \(T\) 的操作后的所有情况排序,用 SA
解决。
设 \(S\) 的一个变换前有 \(i\) 个 \(T\) 的变换,则 ans+=(n-i)
。
先对 \(S\) 和 \(T\) 进行简单拼接,得: \(SSTT\) 。
注意字典序比较在比较至其中一个串结束时仍相同,取短的一个串为字典序小的。
为了保证 \(S\) 的变换在与 \(T\) 的变换字典序相同时,\(S\) 的变换仍排在前面,需进行修改。
考虑 \(S\) 的变换与 \(T\) 的变换对应的后缀 \(S_2S_1S_2T_1T_2T_1T_2\) 和 \(T_2T_1T_2\) ,
其中 \(S=S_1+S_2\) ,\(T=T_1+T_2\) ,\(S_1\) 和 \(T_1\) 长度不一定相等。
显然 \(T_2T_1T_2\) 的长度在 \([n,2n]\) ,考虑两种情况:
- 当 \(\text{len}(S_2S_1S_2)<\text{len}(T_2T_1T_2)\) 时,若前 \(\text{len}(S_2S_1S_2)\) 个字符都相等,
为保证 \(S_2S_1S_2T_1T_2T_1T_2\) 在 \(T_2T_1T_2\) 前,
需在 \(SS\) 后加上ASCII
码比'a'
小的字符,如'`'
。 - 当 \(\text{len}(T_2T_1T_2)<\text{len}(S_2S_1S_2)\) 时,若前 \(\text{len}(T_2T_1T_2)\) 个字符都相等,
为保证 \(S_2S_1S_2T_1T_2T_1T_2\) 在 \(T_2T_1T_2\) 前,
需在最后加上ASCII
码比'z'
大的字符,如'{'
。
故拼接的字符串为:\(SS\text{`}TT\{\) ,注意 SA
基数排序时桶的大小。
G: Yet Another mod M
注意审题qwq,题目中指的是绝对众数。
因此可以发现一下几个性质:
- \(a_i\equiv a_j \pmod M\Rightarrow M~|~(a_i-a_j)\)
- 若存在合法的 \(M\),则 \(P(a_i\bmod M=x)>\dfrac{1}{2}\) ,
即满足 \(a_i\bmod M=x\) 的 \(a_i\) 占一半或一半以上。 - 若存在合法的合数 \(M\) ,则 \(M\) 的质因子也合法,
另外一个数的质因子数为 \(\log\) 级别,其实在该值域内质因子数至多 \(9\) 个。 - 第二条性质结合抽屉原理,可得:
- 对于长度为偶数的数组,若存在合法的 \(M\) ,则一定存在 \(a_i\equiv a_{i+1} \pmod M\) 。
- 对于长度为奇数的数组,另存在一种只选奇数位置上的数的情况。
随机化算法
根据前三条性质可设计出一个随机化算法,每次随机 \(i,j\) 进行check
。
又第一条和第三条性质可知,若存在合法的 \(M\) ,则 \(M\) 可以是 \(|a_i-a_j|\) 的质因子。
枚举质因数然后统计同余的数的个数,记值域最大值为 \(m\) ,
则 check
是 \(\text{O(nlog m)}\)级别的。
总的时间复杂度为 \(\text{O}(wn\text{log }n)\) ,其中 \(w\) 是随机次数,是一个常数。
随机次数超过 \(w\) 仍未随机到正确答案的概率为 \(\left(\dfrac{3}{4}\right)^{w}\) ,
\(w\) 取 \(100\) 时已经是一个很小的概率了 。
非随机化算法
加上第四条性质,对于长度为偶数的枚举相邻数对 check
即可。
对于奇数的特殊情况,判断相邻奇数位置数的 \(\gcd\) 是否大于 \(3\) 即可。
注意 \(3\leqslant M \leqslant 10^9\) ,因此应该用 \(4\) 代替 \(2\) 。
因为若一个偶合数不含 \(2\) 以外的其它质因子,必可写成 \(2^k,k>1\) ,则必被 \(4\) 整除。
总的时间复杂度为 \(\text{O}(n^2\text{log }n)\) 。
总结
本来觉得非随机化算法更妙,但是抵不过人家随机化算法时间复杂度更优啊qwq。
这题的性质挖掘很重要。
Ex: Flipping Coins 2
多项式,不会,寄qwq。