AtCoder Beginner Contest 289 備忘録
コンテストページ: Sky Inc, Programming Contest 2023(AtCoder Beginner Contest 289) - AtCoder
コンテスト中AC: A〜E
コンテスト後にFをAC。WAが出たので、解説を見たが、解法は合っていて実装が間違っていた。
E - Swap Places
高橋くんがいる頂点と青木くんのいる頂点の組について、その状態となるのに最小の操作回数のみを記録していればよく、逆に、同じ状態になるのに、それより操作回数が大きくなる場合は無視できます。
これより、全頂点の組について、その状態になるための最小の操作回数を調べていく解法が考えられます。
状態と遷移の関係を有向グラフとみなすことができるので、BFSにより最小回数を決定していくことができます。
この有向グラフの頂点数は全頂点対となるので個となるのはわかりますが、辺数はコンテスト中分かりませんでした。(ただ、解法として考えうるのがこの方法しかなかったので、提出しました。)
辺数は、公式解説で見積もり方が書いてありました。こちらにもメモしておきます。
- あるグラフの全頂点対について、頂点対から出る全ての辺の合計は以下となる
実装: Submission #38811108 - Sky Inc, Programming Contest 2023(AtCoder Beginner Contest 289)
F - Teleporter Takahashi
操作をシミュレートすると、下のような感じの各辺がx軸とy軸に平行な長方形領域が得られます。
oxoxoxo
xxxxxxx
oxoxoxo
xxxxxxx
oxoxoxo
上の1文字を長方形領域に含まれる格子点の1つとみなします。
oがが移動可能な場所、xが不可能な場所です。また、この領域の縦と横の長さは問題で与えられる長方形によって異なります。
この長方形領域の左端、右端のx座標をそれぞれ、下端、上端のy座標をとします。
oが現れるのは、この長方形領域内の格子点であって、格子点について、が2の倍数かつ、も2の倍数の時となります。
操作終了後にがoの場所に存在すれば、から移動可能ということになります。
回目の操作終了後のをとします。も同様とします。
回目の操作終了後にがoであるための条件は以下です。
問題文の条件から、回しても上記条件を満たすものが存在しない場合はNoです。
ところで、操作に従ってを計算できる必要があります。
これは、端から端への移動になるので、以下のように計算できます。
についても、がに変えて同じように計算できます。
では、Yesの場合に操作の列の構築方法を記載します。
前準備として、操作終了までのを全て記録しておきます。
番目の操作の直後の点をとします。番目の操作で上の格子点を選んだとします。
操作前の点は
同様に、
と計算できます。
ここで、が満たすべき条件は、
なので、
同様に、
ここで、、も満たす必要があります。従って、が満たすべき条件は、
です。この条件内ならどの点を選んでも良いので、x,yいずれも最小の座標を選ぶと、
とできます。
この計算を繰り返していくと操作の列を構築できます。