kaage精進録

雑な解説とかライブラリとかおきもちの垂れ流しです。

AGC013-C Ants on a Circle

30秒眺めただけで解けた。全力でイキっていきたい。

問題リンク

問題概要

長さ L の円環上に蟻が N 匹いて、ある向きを向いている。蟻は向いている向きに一定の速度で進んでいき、他の蟻とぶつかるとそれぞれ向きを変えて進み始める。 T 秒後にそれぞれの蟻がいる位置を求めよ。

解説

とりあえず、聖書を読んだことがあれば発想はすぐにできる。蟻の区別をなくせば、蟻どうしがそのまますり抜けたとみなすことができる。そのため、蟻の区別なしに T 秒後にどこにいるかという情報は簡単にわかる。

次に、他の蟻とぶつかっても跳ね返ることから、蟻たちの相対的な位置関係はずっと変わらないので、並び順も変わらないことがわかる。これで、答えの候補が全部で N 通りに絞れた。

ここで、円環であるがために割り当て方が N 通り出てきてしまうので、これを特定したい。これは、0 の地点を右側から/左側から何回蟻が通過するかカウントすれば簡単にできる。

ボトルネックは蟻の場所のソートになって、O(NlogN) でこの問題が解けた。

感想

本当に信じられないほど一瞬で解けた。うれしい。