3匹の猫

みみねこの競プロ精進メモ

AtCoder Regular Contest 116参加記(~C問題)

今回は面白い問題だらけです。あ、既出問題を見つけられるということはその問題の解法を理解しているということだから、そんなに気にすることではないと思います。
f:id:mmnkblog:20210329011049p:plain

A - Odd vs Even

完全既出だったらしい。こんなことがあっていいのか?

いったん制約を無視して愚直に解いてみる。正整数を素因数分解する場合、愚直に\sqrt Nまで割っていく方法でO(\sqrt N)の計算量となる。約数を列挙する場合、各素因数ごとに何個選ぶかを考える。この時、Nの素因数に2が含まれていた場合、少なくともNの約数のうち半分は偶数である。

N=18 の例。

\begin{array}{c|c|c|c}
 \times & 3^0 & 3^1 & 3^2 \\
 \hline
 2^0 & 1 & 3 & 9 \\
 \hline
 2^1 & 2 & 6 & 18
\end{array}

さらにNの因数に4が含まれている場合、Nの約数のうち半分以上が偶数となる。逆に、Nの素因数に2が含まれていない場合、Nの約数が偶数となることはない。
よって、N2で割った余りと4で割った余りを見ることで答えが求まる。今回は大丈夫だが、素因数の話題が出てきたときは01の扱いに注意し、必要なら場合分けして対処する。

計算量は、O(T)

B - Products of Min-Max

整数列Aは順番を並べ替えても答えに影響しないので、昇順にソートする。こうすると、部分列Bの最大値と最小値を決めたとき、その間にある各要素に関してBに含めても含めなくても\max (B) \times \min (B)の値は変わらない。Bの最大値と最小値を全探索すると、計算量はO(N^2\log N)となる。
さらに、最小値を固定したときの式を書き出して\min (B)を括り出し、残った部分の式を他の最小値の場合と見比べると、その部分も効率的に更新できることがわかる。詳しい数式は公式解説に載っている。理解したいなら実際に式変形してみるのが早い。

よって、計算量をO(N \log N)に削減することができる。

C - Multiple Sequences

解けなかった。公式解説の数え上げによる解法がわかりやすかった。
また、問題文の条件に「A_i \neq A_{i+1}」を追加した小問題を考えると、動的計画法+数え上げで解けるらしい。この場合の計算量はO(M\log N)?になると思う。

感想

C問題をコンテスト中に解きたかった。解説を読んで理解できたので、まだまだ成長できそう。