競プロ備忘録

競プロerの備忘録

ABC338D - Island Tour

本番で解けなくてひどい目に…見た目で無理そうと判断して飛ばしたのがチンパンプレーだったという話で、あとで考えたらそう難しくなかったのが余計に痛すぎる。

Twitter見てたら遅延セグ木とかいもす法とか言ってる人が多いですが、差分更新したほうが簡単じゃないかということでその解法を。

解法

最初から N 1の間がつながっていないとする。この場合は、 X _ {i} X _ {i+1}の差の総和がそのまま答えになる。

これを初期値として、橋を切り離す位置を後ろにずらしながら差分更新していくことを考える。橋を切る位置が後ろに一つずれるというのは、 1番目の島が切り離されて N+1番目の島として後ろに接続されることと同じである。

なので、 X _ {i} 1であるような iについて、 X _ {i-1}, X _ {i+1} 1の距離を、 N + 1との距離に置き換えればよい。置き換えた後は、 X _ {i} N + 1に置き換え、次の島を見ていく。
以後、頭の島は 2, 3, 4...と変化していくので、 Nまでこれを繰り返すだけで良い。

最終的な答えが出るまでに Xに登場する島を最初から最後までなめる必要があるので O(N)回ループが回り、各 X _ {i}は1回ずつチェックされるので、全体で O(N + M)で答えが出る。

実装例は以下。
Submission #49748310 - AtCoder Beginner Contest 338