【比赛记录】 AtCoder Beginner Contest #272

Problems:

# Name Submit
A Integer Sum Submit
B Everyone is Friends Submit
C Max Even Submit
D Root M Leaper Submit
E Add and Mex Submit
F Two Strings Submit
G Yet Another mod M Submit
Ex Flipping Coins 2 Submit

题解:

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。

posted @ 2023-02-16 21:16  loctopus  阅读(53)  评论(0)    收藏  举报