AtCoder Beginner Contest 035 C – オセロ をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 035 C – オセロ

オセロっぽくは無いような……。範囲操作はそのまま扱うとTLEになるものが多く、何らかの形で工夫する必要がある事が多い。

# AtCoder Beginner Contest 035 C - オセロ
# https://atcoder.jp/contests/abc035/tasks/abc035_c
# tag: 範囲操作 いもす法 典型問題

# 範囲操作のクエリが多数あるため、そのまま実装すると TLE。
# どうにか情報を圧縮してやる必要がある。

# 00000000 に対して、(2, 6) の操作が行われるとすると
# 01111100 となる。これを素直に実装すると 5 箇所書き換える
# 必要があるのを、
# 01000010 (imos) という具合に記録することを考える。
# これは、1 の現れたところで直前の駒に対して反転させるという
# 意味合い。
# ちなみにここに更に (4, 6) の操作を行うと、
# 01010000 (imos)
#    ^  ^  ここを書き換える
# といった感じになる。

# これにより、操作一回分につき 2 箇所を書き換えるだけで
# 済むようになる。

# 回答列は、この操作を記録した列を元に再構成していく。
# 01010000 (imos)
#  ^ ^      反転箇所
# 01100000 (result)

def main():
    N, Q = map(int, input().split())
    ops = [list(map(int, input().split())) for _ in range(Q)]

    # 駒が反転するところに 1 を設定していく。
    imos = [0] * (N+1)
    for l, r in ops:
        # 反転の反転を元通りにするため、xor 1 としている。
        imos[l-1] ^= 1
        imos[r] ^= 1
    
    # 順に回答の列を再現していく。
    # imos の末尾は使用しないので注意。
    result = []
    tmp = 0
    for v in imos[:-1]:
        tmp ^= v
        result.append(tmp)

    print(''.join(str(v) for v in result))

main()
Share

コメントを残す

メールアドレスが公開されることはありません。