[python]白駿15787列車が銀河を破った(体現)



📌 質問する


N本の列車が夜明けに銀河を通り抜ける.
汽車には20列1列の席があり,1席に1人座ることができる.
列車番号が1番からN番になった場合、どの列車に対してもM個の命令があります.
コマンドは4種類あります.
1 i x:iは1列目の列車(1≦i≦N)で、2席目(1≦x≦20)で人を乗せる.すでに人がいれば、何の行動も取らない.
2 ix:i 2番目の列車に乗ってx席に座っている人が降ります.誰もそこに座っていなければ、何の行動も取らない.
3 i:i 2番目の列車に乗っている乗客はみな1両後ろに進んでいる.k番目に座った人はk+1番目に座った.もし20番目の席に座っている人がいたら、その人はこの命令の後で降ります.
4 i:i 2番目の列車に乗っている乗客はみな1両前に進んでいる.k位の人はk-1位に移動して座ります.最初の席に誰かが座っていたら、その人はこの命令の後で降ります.
M号命令後、最初の列車から順番に1本の列車が銀河を通過するのは条件があります.
列車は順番に通過し、列車が通過すると乗客の座り方をカタログに記録し、すでにカタログに存在する記録であれば銀河を通過できない.
例えば、下図では、最初の列車のように、乗客の座り方が記録されていないため、銀河を通り抜けることができます.2列目の列車と同じ状態は記録されていないので、2列目の列車も銀河を通り抜けることができます.3番目の列車は1番目の列車の乗客が乗っている状態と同じで、銀河を渡ることはできません.

始発はだれも乗っていない.
銀河を通り抜ける列車の数を出力してください.

入力


入力された第1行は、列車数N(1≦N≦100000)および命令数M(1≦M≦100000)を与える.その後、2行目からM+1行目まで、各行にコマンドがあります.

しゅつりょく


銀河を通り抜ける列車の数を出力してください.

入力例1


5 5
1 1 1
1 1 2
1 2 2
1 2 3
3 1

サンプル出力1


2

📌 に答える


💬 Code

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
train = [[0 for _ in range(20)] for _ in range(n)]
state = []

for _ in range(m):
    a = list(map(int, input().split()))

    if a[0] == 1:
        train[a[1] - 1][a[2] - 1] = 1
        
    elif a[0] == 2:
        train[a[1] - 1][a[2] - 1] = 0
        
    elif a[0] == 3:
        for j in range(19, 0, -1):
            train[a[1] - 1][j] = train[a[1] - 1][j - 1]
        train[a[1] - 1][0] = 0
        
    elif a[0] == 4:
        for j in range(19):
            train[a[1] - 1][j] = train[a[1] - 1][j + 1]
        train[a[1] - 1][19] = 0

cnt = 0
for i in range(n):
    if train[i] not in state:
        state.append(train[i])
        cnt += 1

print(cnt)

💡 Solution


  • 列車ごとに20要素のリストを生成し、20個をすべて0にリセットします(誰も乗っていません)

  • 命令が1であれば、x番目の座席の値のみを1に変更し(元のx番目の座席に人が乗っているかどうかにかかわらず、どうせ座席値は1でなければならないので、着席しているかどうかを判別する必要がある)、命令2、3、4も同様の理由で着席しているかどうかを判別する必要がある

  • 銀河を通る列車の状態を格納するリストstateを作成し、ドアが列車数で回転するとi列車の状態がstateにない場合、state,cnt+=1を挿入します.