結果
| 問題 | No.1954 CHECKER×CHECKER(2) |
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-20 20:34:02 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 88 ms / 1,000 ms |
| コード長 | 3,743 bytes |
| コンパイル時間 | 168 ms |
| コンパイル使用メモリ | 82,228 KB |
| 実行使用メモリ | 78,052 KB |
| 最終ジャッジ日時 | 2025-03-20 20:35:20 |
| 合計ジャッジ時間 | 2,736 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
def main():
import sys
input = sys.stdin.read().split()
idx = 0
H = int(input[idx]); idx +=1
W = int(input[idx]); idx +=1
grid = []
for _ in range(H):
s = input[idx].strip()
idx +=1
row = [1 if c == '#' else 0 for c in s]
grid.append(row)
M = int(input[idx]); idx +=1
row_ops = []
col_ops = []
for _ in range(M):
t = int(input[idx]); idx +=1
n = int(input[idx]); idx +=1
if t == 1:
row_ops.append((t, n))
else:
col_ops.append((t, n))
def is_solvable(augmented, n_vars):
m = len(augmented)
if m == 0:
return True
for col in range(n_vars):
pivot = -1
for row in range(col, m):
if augmented[row][col] == 1:
pivot = row
break
if pivot == -1:
continue
augmented[col], augmented[pivot] = augmented[pivot], augmented[col]
for row in range(m):
if row != col and augmented[row][col] == 1:
for c in range(col, len(augmented[row])):
augmented[row][c] ^= augmented[col][c]
for row in range(len(augmented)):
all_zero = True
for c in range(n_vars):
if augmented[row][c] != 0:
all_zero = False
break
if all_zero and augmented[row][-1] == 1:
return False
return True
for case in [0, 1]:
desired = [[ ( (i + j) % 2 ) == case for j in range(W)] for i in range(H)]
X = [[ (grid[i][j] ^ desired[i][j]) for j in range(W)] for i in range(H)]
for row0 in [0, 1]:
rf = [0] * H
cf = [0] * W
rf[0] = row0
for j in range(W):
cf[j] = X[0][j] ^ rf[0]
valid = True
for i in range(1, H):
rf[i] = X[i][0] ^ cf[0]
if valid:
for i in range(H):
if not valid:
break
for j in range(W):
if (rf[i] ^ cf[j]) != X[i][j]:
valid = False
break
if not valid:
continue
augmented_row = []
for i in range(H):
row_equation = []
for (t, n_val) in row_ops:
if n_val >= (i + 1):
row_equation.append(1)
else:
row_equation.append(0)
row_equation.append(rf[i])
augmented_row.append(row_equation)
variables_row = len(row_ops)
row_possible = is_solvable(augmented_row, variables_row)
if not row_possible:
continue
augmented_col = []
for j in range(W):
col_equation = []
for (t, n_val) in col_ops:
if n_val >= (j + 1):
col_equation.append(1)
else:
col_equation.append(0)
col_equation.append(cf[j])
augmented_col.append(col_equation)
variables_col = len(col_ops)
col_possible = is_solvable(augmented_col, variables_col)
if row_possible and col_possible:
print("Yes")
return
print("No")
if __name__ == "__main__":
main()
lam6er