2021年1月11日月曜日

AtCoder Regular Contest 111

 ABの二完で終了。
 復活してからのARCでは失敗が少なかったのに。悲しい。


A - Simple Math 2

 かなり長いこと分からなかったのですが、
$10^N=p*M+r$
 とおき、さらに、
$p=q*M+ANS$
 とおいて、下式を上式に代入すると考えると、$M^2$での余りを考えれば良いと気付けました。

B - Reversible Cards

 既出らしいですが、気付けませんでした。
 当時は解けていなかったので、今回は解けて良かった。

C - Too Heavy

 ツイートか何かで「重い荷物の順番に交換すれば良い」というほぼ答え同然の情報を得ていても、30分程度実装にかかってしまった。

 どういう問題なのか、情報を整理するのか難しいと思う。

 頭の整理のため、

・B:荷物の番号→荷物の重さ
・P:人物の番号→持っている荷物の番号
(及び、・Pの逆関数:荷物の番号→人物の番号)

 と、それぞれがどういう関数かメモしたら多少分かりやすくなったが、それでも苦戦した。

D - Orientation

 iとjを結ぶ辺で、C[i]とC[j]が異なるなら、Cが大きい方から小さい方へ結べばよい。
 問題は、同じときにどうするか、だが、公式解説にある通り、よく考えるとDFSするだけで良い! となる。

 確かに、よくDFSの性質を考えてみればそうなりそうで、証明はDFS木などを使えばできる。

 ただ、それが自然と感じられるためには、DFS木、lowlink、橋といったあたりに親しんでいることが必要そう。勉強不足でした。
 今調べた中では、hosさんのpdfが一番分かりやすかった。AOJにも入っている内容なので、ちゃんとやっておかねば。

E - Simple Math 3

 snukeさんの解説動画を見てAC。
 floor sumを使うと分かっても戸惑ってしまった。けど、その知識があるなら解けなきゃダメですね。図を描いて、順を追って考えればfloor sumが出てくるという問題なので。

F - Do you like query problems?

 snukeさんの解説動画を二回見てAC。
 一回解説動画を見た時点だとよく分からなかったのだけれど、もう一回見たら意外と単純だと分かりコードにできました。

 解説動画を理解する上でのポイントは、
・N=1のとき、「k回目のクエリでsumを取るときに加算される値」が$C^k*$(係数)の和
みたいに表せるので、kを1~Qで動かした和が等比数列の和の公式で求められ、大体O(1)なこと。(繰り返し二乗法を使うので本当はO(1)ではありませんが)
・N=1の場合で求めたA, X, Bが、Nが一般の場合でも求められること

 といった辺りだと思います。

 何を教訓とすべきかは難しいです。特に、一回解説動画を見た後もできなかったのは、何かが思いつかなかったのではなく、複雑な状況を理解し式に落とす力がなかった、という感じなので。
 こういう、複雑な状況を整理する力はどうすれば身に着くんでしょう。マラソンをやると効果があったりしないかな……。

0 件のコメント:

コメントを投稿