ラベル DFS木 の投稿を表示しています。 すべての投稿を表示
ラベル DFS木 の投稿を表示しています。 すべての投稿を表示

2022年11月1日火曜日

Codeforces Round #819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022

 Cまで三完。約20分遅れで書き終ったEはコンテスト後、ACしました。その後、剽窃が発覚しunratedに。

コンテストへのリンク
コンテスト後のツイート


 D. Edge Split

 解説AC。
 これを飛ばす判断は間違ってなかったと思う。

 赤、青それぞれが連結な木になるよう色を塗れば良い、と思い、それをどう実装すれば良いか分からなかった。
 が、実際は連結性はいらなかった! 赤、青それぞれが森になっていればOK。

 実装はDFS木の性質を使うと良い。
 DFSで全域木をとって、残り三辺がサイクルになると困るが、DFS木の後退辺が親子関係にあるので、サイクルの一辺の色を変え、代わりに根へ付け替えれば良い。
 (という説明は、tatyamさんのツイートそのままです。これを思いつかないと実装で迷走しそう)

2022年6月28日火曜日

AtCoder Regular Contest 143

 Cまで三完。

コンテスト後のツイート

C - Piles of Pebbles

 コンテスト中は、(まずちょっと考えて一度飛ばそうかとDに行き、分からず戻った後)、

・再帰で愚直解を書く
・書いてみたら、X=Y=1のときは見たことある結果になる
この問題を思い出し、解説を読む。
・大体同じように解けそう、と分かり、(愚直解と一致するか試した後)AC

 という流れでした。

 類題を覚えていたのは、当時嘘解法でACしたためです。嘘解法でACすると、記憶に残りやすいので良いかも?

D - Bridges

 解法ツイートを見てAC。

 コンテスト中、最初は(問題文通り)2N個の頂点があるグラフを考えていたけれど、Cを解いて戻った後は、N個の頂点のグラフで考察すべきでは? とは思い直した。N頂点のグラフで、多くの頂点がサイクルに巻き込まれるような辺の貼り方をすれば良さそう……と思うも、最小循環費用流? とか考えたりして、やり方が分からなくなってしまった。

 落ち着いて見れば、これはDFSする(DFS木を考える)だけで良い。
 こういったDFS系の問題は落とすことが多いので注意しようと思っていたのに、また解けなかったというのは悲しい。最初、2N頂点のグラフを考えていたために引きずられた、という部分はあるが、これは思いつきたかった。

E - Reversi 

 解説放送を見てAC。

 葉について考察し、それをもとに木DPをすればOK。

 葉については考えたけど、それを元に有効辺を付けようとは考えなかった。石を取り除けるかどうかの判定をどうやるんだろう、と考えるだけでなく、辞書順最小の裏返し方をどう見つけるんだろう、と考えたなら有効辺にするのは結構自然かもしれない。

 まず判定をどうにかしよう、と思ってしまうけど、(この問題に関しては)辞書順のことも考えて臨むべきだったのかな。

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が一般の場合でも求められること

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

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