結果
| 問題 |
No.1056 2D Lamps
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 19:25:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,777 bytes |
| コンパイル時間 | 184 ms |
| コンパイル使用メモリ | 82,840 KB |
| 実行使用メモリ | 53,616 KB |
| 最終ジャッジ日時 | 2025-06-12 19:25:15 |
| 合計ジャッジ時間 | 6,052 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | TLE * 1 -- * 13 |
ソースコード
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N = int(input[idx])
idx += 1
M = int(input[idx])
idx += 1
# Read M configurations
configs = []
for _ in range(M):
mat = []
for _ in range(N):
row = input[idx]
idx += 1
mat.append(row)
# Convert to bitmask
bitmask = 0
for i in range(N):
for j in range(N):
if mat[i][j] == '#':
pos = i * N + j
bitmask |= (1 << pos)
configs.append(bitmask)
# Precompute all line flip vectors
line_flips = []
# Rows
for i in range(N):
vec = 0
for j in range(N):
pos = i * N + j
vec |= (1 << pos)
line_flips.append(vec)
# Columns
for j in range(N):
vec = 0
for i in range(N):
pos = i * N + j
vec |= (1 << pos)
line_flips.append(vec)
# Diagonals (i + j = s, s from 0 to 2N-2)
for s in range(2 * N - 1):
vec = 0
for i in range(N):
j = s - i
if 0 <= j < N:
pos = i * N + j
vec |= (1 << pos)
line_flips.append(vec)
# Anti-diagonals (i - j = t, t from -(N-1) to N-1)
for t in range(- (N - 1), N):
vec = 0
for i in range(N):
j = i - t
if 0 <= j < N:
pos = i * N + j
vec |= (1 << pos)
line_flips.append(vec)
# Gaussian elimination to find basis
basis = []
for vec in line_flips:
v = vec
for (pivot, b) in basis:
if (v >> pivot) & 1:
v ^= b
if v != 0:
# Find the first set bit
pivot = 0
while (v >> pivot) & 1 == 0:
pivot += 1
# Insert into basis in order
insert_pos = 0
while insert_pos < len(basis) and basis[insert_pos][0] < pivot:
insert_pos += 1
basis.insert(insert_pos, (pivot, v))
# Function to check if a vector is in the row space
def is_in_span(vec):
v = vec
for (pivot, b) in basis:
if (v >> pivot) & 1:
v ^= b
return v == 0
# Prepare the output
output = []
for i in range(M):
for j in range(i + 1, M):
D = configs[i] ^ configs[j]
if is_in_span(D):
output.append('1')
else:
output.append('0')
# Print the output
count = 0
for i in range(M - 1):
line = output[count : count + (M - 1 - i)]
print(''.join(line))
count += (M - 1 - i)
if __name__ == "__main__":
main()
gew1fw