結果
| 問題 |
No.1078 I love Matrix Construction
|
| コンテスト | |
| ユーザー |
Salmonize
|
| 提出日時 | 2020-06-12 23:10:43 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 1,842 ms / 2,000 ms |
| コード長 | 2,713 bytes |
| コンパイル時間 | 207 ms |
| コンパイル使用メモリ | 13,184 KB |
| 実行使用メモリ | 159,948 KB |
| 最終ジャッジ日時 | 2024-06-24 05:53:35 |
| 合計ジャッジ時間 | 17,425 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 |
ソースコード
import sys
readline = sys.stdin.readline
readall = sys.stdin.read
ns = lambda: readline().rstrip()
ni = lambda: int(readline().rstrip())
nm = lambda: map(int, readline().split())
nl = lambda: list(map(int, readline().split()))
prn = lambda x: print(*x, sep='\n')
def StronglyConnectedComponents(N, G, RG):
group_cnt = 0
used = [0] * N
group = [0] * N
order = list()
for s in range(N):
if not used[s]:
st = [s]
used[s] = 1
while st:
v = st[-1]
fl = 0
if used[v] <= len(G[v]):
if not used[G[v][used[v]-1]]:
st.append(G[v][used[v]-1])
used[G[v][used[v]-1]] = 1
used[v] += 1
else:
order.append(v)
st.pop()
used = [0] * N
for s in reversed(order):
if not used[s]:
st = [s]
used[s] = 1
while st:
v = st[-1]
if used[v] <= len(RG[v]):
if not used[RG[v][used[v]-1]]:
st.append(RG[v][used[v]-1])
used[RG[v][used[v]-1]] = 1
used[v] += 1
else:
group[v] = group_cnt
st.pop()
group_cnt += 1
return group_cnt, group
class TwoSatisfilability:
def __init__(self, N):
self.N = N
self.G = [list() for _ in range(N*2)]
self.RG = [list() for _ in range(N*2)]
self.res = [0] * N
def solve(self):
_, group = StronglyConnectedComponents(self.N * 2, self.G, self.RG)
for i in range(self.N):
if group[i] == group[i+self.N]:
return False, list()
self.res[i] = int(group[i] > group[i+self.N])
return True, self.res
def _add_edge(self, a, b):
self.G[a].append(b)
self.RG[b].append(a)
return
def add(self, a, apos, b, bpos):
'''
a V b
'''
self._add_edge(a + self.N * apos, b + self.N * (bpos ^ 1))
self._add_edge(b + self.N * bpos, a + self.N * (apos ^ 1))
return
def solve():
n = ni()
s = [x-1 for x in nl()]
t = [x-1 for x in nl()]
u = nl()
sat = TwoSatisfilability(n**2)
for i in range(n):
cs, ct, cu = s[i], t[i], u[i]
for j in range(n):
x = cs * n + j
y = j * n + ct
sat.add(x, (cu & 1) ^ 1, y, (cu >> 1) ^ 1)
bo, ret = sat.solve()
if not bo:
print(-1)
else:
for i in range(n):
print(*ret[i*n:(i+1)*n])
return
solve()
Salmonize