公式

A - ARC Arc 解説 by hirayuu_At


ヒント → https://atcoder.jp/contests/arc192/editorial/12151


\(N\)\(4\) で割った余りで場合分けします。

\(N\)\(4\) の倍数のとき

ARCRARCR...ARCR という文字列が常に良い文字列です。

\(N\) が奇数のとき

\(A\) の要素がすべて \(0\) の場合は良い文字列は存在しません。

証明 \(i\) を選んで操作できるとき、\(i-1\)\(i+1\) を選んで操作することは不可能です。
そのため、同じ場所には操作しないことにすると、操作する項は交わりません。よって、\(A\) に含まれる \(1\) の個数は常に偶数個になります。
\(N\) が奇数であることより、奇数個ある \(A\) の要素をすべて \(1\) にすることは不可能です。

\(A\)\(1\) が含まれる場合を考えます。\(A_x=1\) となる \(x\) を任意に \(1\) つ取ります。\(x=N\) のときに構成できれば、それを適切にシフトすることにより一般の場合にも構成できます。そして、\(x=N\) の場合は ARCRARCR...ARC または ARCRARCR...CRA が条件を満たします。

\(N\)\(4\) で割って \(2\) 余るとき

\(A\) の要素がすべて \(0\) の場合は良い文字列は存在しません。

証明 操作ができる必要があるので、\(S\) の先頭 \(3\) 文字が ARC であるとして一般性を失いません。
ここから \(A_3\)\(A_4\) に対して操作できるようにするには ARCRA とするほかありません。
このようにして文字列が一意に定まっていき、最終的にARCRARCR...CRAR という文字列を得ます。
しかしこの文字列では \(A\) の末尾 \(2\) 項を操作することができないので、\(A\) の要素をすべて \(1\) にすることは不可能です。

\(A\)\(1\) が含まれる場合を考えます。\(A_i=1\) であるような \(i\) の集合を \(T\) とします。\(T\) に奇数または偶数のうち含まれないものがあるときも、良い文字列は存在しません。

証明 \(A\) のすべての要素が \(0\) の場合を考えます。
\(A_i=0\) であるような奇数 \(i\) の個数を \(X\) と、\(A_i=0\) であるような偶数 \(i\) の個数を \(Y\) と定義します。はじめ、\(X=Y\) です。
過去に操作した箇所には二度と操作しないことにすると、操作する項が交わらないことより、\(1\) 回の操作で \(X\)\(Y\) がどちらも必ず \(1\) 減ります。
\(X=Y=0\) にすることができないことは先ほど示したので、この操作で \(X=0\) にも \(Y=0\) にもなり得ません。よって、\(T\) に奇数または偶数のうち含まれないものがある場合は良い文字列は存在しません。

\(T\) に奇数と偶数がどちらも含まれている場合は、良い文字列が存在します。\(T\) のうち奇数であるもののうち任意の一つを \(x\) とし、偶数であるもののうち任意の一つを \(y\) とします。

\(y=N\) の場合に構成できればそれを適切にシフトすることにより一般の場合にも構成できます。そして、\(y=N\) の場合は

  • \(x\)\(4\) で割って \(1\) 余る場合、長さ \(x\) の文字列ARCRARCR...CRA と 長さ \(N-x\) の文字列 ARCRARCR...CRA を結合したもの
  • \(x\)\(4\) で割って \(3\) 余る場合、長さ \(x\) の文字列ARCRARCR...ARC と 長さ \(N-x\) の文字列 ARCRARCR...ARC を結合したもの

が条件を満たします。


以上ですべての場合が尽くされました。

実装例 (PyPy3)

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

if N % 4 == 0:
    print("Yes")
elif N % 2 == 1:
    if 1 in A:
        print("Yes")
    else:
        print("No")
else:
    odd = False
    even = False
    for i in range(N):
        if A[i] == 1:
            if i % 2 == 1:
                odd = True
            else:
                even = True

    if odd and even:
        print("Yes")
    else:
        print("No")

投稿日時:
最終更新: