AGC023-D:Go Home

こういう問題を解いていると競プロ楽しいなと思う(やはりパズルが好きなのでは?)。

問題

D - Go Home

解法

 すべてのマンションが地点Sから見て同じ方向にあるときは自明なので、そうでない場合を考える。
 初期状態から考えるとつらい気持ちになるので、終了状態から近い方から考えてみる。Sから見て最も座標の小さい側にあるマンション1の住人と、最も大きい側にあるマンションNの住人だけが残った状態のバスは、今までのバスの軌跡によらずP_1P_Nの大小だけでバスの動きが決まる。仮にP_1\gt P_Nだとすると、マンションNの住人はマンション1の住人がバスを降りるまで、つまり一番最後までバス取り残されることになる(かわいそう)。そうなると、マンションNの住人の目標は、マンション1の住人にできるだけ早くバスを降りてもらうになるので、彼らの目標はマンション1の住人と同じだと考えてよい。するとマンションNのことはもう考えなくてよいから、マンション1からN-1までだと思って同様に考えればよい。このことを最初に述べた自明な形になるまで繰り返すことで、逆順でバスがどのように動くかを決めることができるので、この問題が解ける。時間計算量はO(N)になる。

実装

Submission #6134992 - AtCoder Grand Contest 023
実装が一番難しかった。実装で明示的にバスの動きを追わなくてもできそうだけど、そうしてしまった方が実装が楽だった。