結果
| 問題 | No.3602 Queen XOR Score |
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2026-07-25 23:49:31 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 208 ms / 2,000 ms |
| + 438µs | |
| コード長 | 3,955 bytes |
| 記録 | |
| コンパイル時間 | 236 ms |
| コンパイル使用メモリ | 95,848 KB |
| 実行使用メモリ | 89,732 KB |
| 最終ジャッジ日時 | 2026-07-25 23:49:46 |
| 合計ジャッジ時間 | 6,653 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 29 |
ソースコード
class XORBasis:
def __init__(self, A):
self.A = A
self.base = []
self.mask = []
self.IDX = []
self.dependent = -1
for i, a in enumerate(self.A):
n = a
xor = 1<<len(self.base)
for j, b in enumerate(self.base):
if n^b < n:
n ^= b
xor ^= self.mask[j]
if n:
self.IDX.append(i)
self.base.append(n)
self.mask.append(xor)
elif self.dependent == -1:
self.dependent = i
if len(self.base) == 0:
return
pairs = sorted(zip(self.base, self.mask), key=lambda x:x[0], reverse=True)
self.base, self.mask = map(list, zip(*pairs))
for i in range(1, len(self.base)):
for j in range(i):
if self.base[j]^self.base[i] < self.base[j]:
self.base[j] ^= self.base[i]
self.mask[j] ^= self.mask[i]
def can_make(self, x):
for b in self.base:
if 1<<(b.bit_length()-1) & x:
x ^= b
return x == 0
def can_make_nonemptyzero(self):
return self.dependent != -1
def get_indices(self, x):
xor = 0
for i, b in enumerate(self.base):
if 1<<(b.bit_length()-1) & x:
x ^= b
xor ^= self.mask[i]
if x:
return None
ans = []
for i in range(len(self.base)):
if 1<<i & xor:
ans.append(self.IDX[i])
return ans
def get_indices_nonemptyzero(self):
if not self.can_make_nonemptyzero():
return None
return sorted(self.get_indices(self.A[self.dependent])+[self.dependent])
def get_max(self, x = 0):
for b in self.base:
x = max(x, x^b)
return x
def get_min(self, x = 0):
for b in self.base:
x = min(x, x^b)
return x
def kth_min(self, k):
if k < 0 or 1<<len(self.base) < k:
return -1
ans = 0
for i, b in enumerate(self.base):
if 1<<(len(self.base)-1-i) & k:
ans ^= b
return ans
def kth_max(self, k):
return self.kth_min((1<<len(self.base))-k)
def rotateR(A):
return list(map(list, zip(*A[::-1])))
H, W = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(H)]
Q = int(input())
X = [int(input()) for _ in range(Q)]
flag = False
if W == 2:
A = rotateR(A)
flag = True
address = [[-1]*W for _ in range(H)]
for i in range(H):
for j in range(W):
if i%2 == 0:
address[i][j] = i*W+j
else:
address[i][j] = i*W+(W-1-j)
B = [-1]*(H*W)
for i in range(H):
for j in range(W):
B[address[i][j]] = A[i][j]
basis = XORBasis(B)
for x in X:
if x == 0:
print(3)
print(1, 1)
print(1, 2)
print(1, 1)
print(1, 2)
continue
IDX = basis.get_indices(x)
if IDX is None:
print(-1)
continue
route = []
for i in range(H):
order = list(range(W))
if i%2 == 1:
order = order[::-1]
for j in order:
route.append((i, j))
if H == W == 2:
route2 = route[:]
else:
route2 = route[::-1]
size = len(route2)
for i in range(size):
h, w = route2[i]
route2[i] = (h, W-1-w)
odd, even = set(), set()
for i, idx in enumerate(IDX):
if i%2 == 0:
odd.add(idx)
else:
even.add(idx)
ans = []
for i, j in route:
if address[i][j] not in odd:
ans.append((i, j))
for i, j in route2:
if address[i][j] not in even:
ans.append((i, j))
print(len(ans)-1)
for h, w in ans:
if flag:
h, w = W-1-w, h
print(h+1, w+1)
detteiuu