Official
F - Bingo 2 Editorial
by
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: