Official

F - Bingo 2 Editorial by toam


各マスに対して,そのマスに印がつけられるターンを書き込みます(印がつけられない場合は \(\mathrm{inf}\) を書き込むことにします).このとき,ある列がビンゴを達成するターンは,その列に含まれるマスに書かれた数の最大値に等しいです.すべての列に対して,その列が何ターン目にビンゴを達成するかを求め,それらの最小値を答えればよいです.計算量は \(O(N^2+T)\) です.

N, T = map(int, input().split())
A = list(map(lambda x: int(x) - 1, input().split()))
inf = 1 << 30
mat = [[inf] * N for i in range(N)]

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

ans = inf

# 横
for x in range(N):
    mx = 0
    for y in range(N):
        mx = max(mx, mat[x][y])
    ans = min(ans, mx)

# 縦
for y in range(N):
    mx = 0
    for x in range(N):
        mx = max(mx, mat[x][y])
    ans = min(ans, mx)

# 斜め
for x, y, dx, dy in [[0, 0, 1, 1], [0, N - 1, 1, -1]]:
    mx = 0
    for _ in range(N):
        mx = max(mx, mat[x][y])
        x += dx
        y += dy
    ans = min(ans, mx)

if ans == inf:
    ans = -1
print(ans)

posted:
last update: