Official

F - Bingo 2 Editorial by toam


横,縦,斜めの各列に対して,印がつけられているマスの個数を管理します.

各ターンでは,数字が書かれているマスを含む列に対して,その列に含まれるマスの個数を更新します.Bingo を達成したかどうかの判定はそのマスが含まれる列のみをチェックすれば十分です.数字が書かれているマスを含む列は高々 \(4\) しかないため,この更新は \(O(1)\) で行うことができます.

全体の計算量は \(O(N+T)\) です.

実装例

N, T = map(int, input().split())
A = list(map(lambda x: int(x) - 1, input().split()))
row = [0] * N
col = [0] * N
diag = [0] * 2

for i in range(T):
    x = A[i] // N
    y = A[i] % N

    # 横
    row[x] += 1
    if row[x] == N:
        print(i + 1)
        exit()

    # 縦
    col[y] += 1
    if col[y] == N:
        print(i + 1)
        exit()

    # 左上 - 右下 方向の斜め
    if x == y:
        diag[0] += 1
        if diag[0] == N:
            print(i + 1)
            exit()

    # 右上 - 左下 方向の斜め
    if x + y == N - 1:
        diag[1] += 1
        if diag[1] == N:
            print(i + 1)
            exit()

print(-1)

posted:
last update: