ARC138B - 01 Generation

考え方

逆順に操作していって$A$を空の数列にまで戻せるかを確かめる.

flip回数の偶奇性を記録しておき,「操作Bを逆順に(できるだけ)行う→操作Aを逆順に行う」を繰り返す.flip回数が奇数なら0を1で置き換えて考えれば良い.

操作Bを逆順に(できるだけ)行うのは,端にflipさせた文字が出るまで削った方が,あとの操作で有利なため.

回答例

from collections import deque

N = int(input())
A = list(map(int, input().split()))

q = deque(A)
flip = 0
while q:
    if q[0] == q[-1] == flip ^ 1:
        break
    while q and q[-1] == flip:
        q.pop()
    if q and q[0] == flip:
        q.popleft()
        flip ^= 1

print('Yes' if not q else 'No')

【参考】Submission #30810847 - Daiwa Securities Co. Ltd. Programming Contest 2022 Spring(AtCoder Regular Contest 138)