結果
| 問題 |
No.3339 Tree on Checkerboard
|
| コンテスト | |
| ユーザー |
ikatakos
|
| 提出日時 | 2025-11-08 02:09:20 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,306 bytes |
| コンパイル時間 | 275 ms |
| コンパイル使用メモリ | 12,416 KB |
| 実行使用メモリ | 75,056 KB |
| 最終ジャッジ日時 | 2025-11-08 02:10:20 |
| 合計ジャッジ時間 | 59,395 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 51 WA * 47 |
ソースコード
class UnionFind:
def __init__(self, n):
self.table = [-1] * n
def root(self, x):
stack = []
tbl = self.table
while tbl[x] >= 0:
stack.append(x)
x = tbl[x]
for y in stack:
tbl[y] = x
return x
def find(self, x, y):
return self.root(x) == self.root(y)
def unite(self, x, y):
r1 = self.root(x)
r2 = self.root(y)
if r1 == r2:
return False
d1 = self.table[r1]
d2 = self.table[r2]
if d1 <= d2:
self.table[r2] = r1
self.table[r1] += d2
else:
self.table[r1] = r2
self.table[r2] += d1
return True
def get_size(self, x):
return -self.table[self.root(x)]
def solve(n):
if n == 2:
return [['#', '.'], ['.', '.']]
if n % 2 == 0:
ans2 = solve(n - 1)
for i in range(n - 1):
if ans2[0][i] == '#' or ans2[i][0] == '#':
return []
ans = [['#', '.'] * (n // 2)]
for i in range(n - 1):
ans.append(['.' if i % 2 == 0 else '#'] + ans2[i])
return ans
w = n // 2
def get_key(i, j):
return i // 2 * w + j // 2
uft = UnionFind(w ** 2)
ans = []
for i in range(n):
if i % 2 == 0:
ans.append(['.'] * n)
else:
ans.append(['.', '#'] * w + ['.'])
t = 2
while t < n - 1:
for i in range(t, n - 1, t * 2):
for j in range(t, n - 1, t * 2):
ans[i][j] = '#'
uft.unite(get_key(i - 1, j - 1), get_key(i - 1, j + 1))
uft.unite(get_key(i - 1, j - 1), get_key(i + 1, j - 1))
uft.unite(get_key(i - 1, j - 1), get_key(i + 1, j + 1))
t <<= 1
ans[-1][-1] = '#'
lb = get_key(n - 2, n - 2)
j = lb - 1
while j > lb - w:
if uft.find(j, lb):
j -= 1
continue
k = j - 1
while uft.find(j, k):
k -= 1
k += 1
ans[-1][(k % w) * 2] = '#'
ans[(k % w) * 2][-1] = '#'
uft.unite(k - 1, lb)
j = k - 1
return ans
n = int(input())
ans = solve(n)
if len(ans) == 0:
print(-1)
else:
for row in ans:
print(''.join(row))
ikatakos