mini notes

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

yukicoder No.929 よくあるボールを移動するやつ(★2)

問題:No.929 よくあるボールを移動するやつ - yukicoder

解答:#472383 (C++14) No.929 よくあるボールを移動するやつ - yukicoder

解法:b[i] = 0であるiを覚えておくキュー(zero)とb[i] >= 2であるiを覚えておくキュー(pos)を準備しておく。また、解答変数をansとする。

b[i] = 0のとき、もしposが空でなければ手前に2以上の項があり、そこから1をもらうことになるため、i - pos.top()をansに加える。posが空ならその先の2以上の項から1をもらうことになる。ひとまずzeroにiをpushする。

b[i] = 1のときは答えに影響しないためスルー。

b[i] >=2 のとき、もしzeroが空でなければ手前に0の項があり、そこに1をあげるため、i - pos.top()をansに加える。zeroが空ならその先の0の項に1をあげることになる。ひとまずposにiをpushする。pushの回数はb[i]の大きさにより増減する。