mini notes

競技プログラミングの解法メモを残していきます。

ABC167 F - Bracket Sequencing (600)

問題:F - Bracket Sequencing

解答:Submission #13137686 - AtCoder Beginner Contest 167

解法:'('でインクリメント、')'でデクリメントする変数lを準備する。各文字列についてこの変数が途中でとりうる最小値、最終値のタプル(m, f)が肝となる。

f ≧ 0 の文字列については、mが大きい順に結合してゆくのが良い。文字列(mi, fi)を結合する際は、結合直前のlがl + mi ≧ 0であれば結合可能であり、結合後は l = l + fiとなる。

f < 0 の文字列はその後結合してゆく。これはlの推移を逆から見るとf ≧ 0の場合と同様である。これは、文字列を反転させかつ括弧を逆にした文字列でl, m, fを計測するのと同じである。このとき、新たな文字列のlの「最小値」、「最終値」(m', f') は元の文字列の(m, f)を用いて(m - f, -f)と表される。よってこの(m', f')を用いて同様のことをチェックすればよい。

なお最終的なlが0になることを別途確認する必要がある。自分のコードではlの合計を直接計算している。

kmjpさんのブログを参考にしました。

kmjp.hatenablog.jp