Official

B - Isolated Seats Editorial by vwxyz


原案:vwxyz

各椅子について条件を満たすかどうかを判定すればよいです。
左の椅子と右の椅子についてはそれぞれ場合分けしてもよいですが、番兵と呼ばれるテクニックを使うと実装が少し楽になるので紹介します。

最も左の椅子のさらに左に、人が座っていない椅子を置きます。
最も右の椅子のさらに右にも、人が座っていない椅子を置きます。
実装上では、\(S\) の先頭と末尾に x を追加します。
すると、追加した椅子を以外の \(N\) 個の椅子については、以下の \(3\) つの条件を満たすかどうかを判定すればよくなります。

  • 人が座っていない
  • 左の椅子に人が座っていない
  • 右の椅子に人が座っていない

左から \(1,N\) 番目の椅子について場合分けを行う必要がなくなります。


今回の問題では場合分けをしても番兵を使ってもそれほど手間は変わりませんが、複雑な問題ではこのテクニックを使うことで実装が大幅に楽になることも珍しくないです。

posted:
last update: