結果

問題 No.1078 I love Matrix Construction
ユーザー tamato
提出日時 2020-06-13 17:40:59
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 848 ms / 2,000 ms
コード長 3,748 bytes
コンパイル時間 196 ms
コンパイル使用メモリ 82,308 KB
実行使用メモリ 185,900 KB
最終ジャッジ日時 2024-06-25 15:54:10
合計ジャッジ時間 10,789 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 22
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

mod = 1000000007
eps = 10**-9
def main():
import sys
from collections import deque
input = sys.stdin.readline
from collections import deque
# compressed[v]: v
# num:
def SCC(adj, adj_rev):
N = len(adj) - 1
seen = [0] * (N + 1)
compressed = [0] * (N + 1)
order = []
for v0 in range(1, N + 1):
if seen[v0]:
continue
st = deque()
st.append(v0)
while st:
v = st.pop()
if v < 0:
order.append(-v)
else:
if seen[v]:
continue
seen[v] = 1
st.append(-v)
for u in adj[v]:
st.append(u)
seen = [0] * (N + 1)
num = 0
for v0 in reversed(order):
if seen[v0]:
continue
num += 1
st = deque()
st.append(v0)
seen[v0] = 1
compressed[v0] = num
while st:
v = st.pop()
for u in adj_rev[v]:
if seen[u]:
continue
seen[u] = 1
compressed[u] = num
st.append(u)
return num, compressed
#
# SCC()num, compressed
def construct(adj, num, compressed):
N = len(adj) - 1
adj_compressed = [set() for _ in range(num + 1)]
for v in range(1, N + 1):
v_cmp = compressed[v]
for u in adj[v]:
u_cmp = compressed[u]
if v_cmp != u_cmp:
adj_compressed[v_cmp].add(u_cmp)
return adj_compressed
def fin():
print(-1)
exit()
N = int(input())
S = list(map(int, input().split()))
T = list(map(int, input().split()))
U = list(map(int, input().split()))
def idx(i, j, flg):
return i * N + j + 1 + flg * N*N
adj = [[] for _ in range(N*N*2 + 1)]
adj_rev = [[] for _ in range(N * N * 2 + 1)]
for i in range(N):
s = S[i] - 1
t = T[i] - 1
u = U[i]
if u == 0:
flg_s = 1
flg_t = 1
elif u == 1:
flg_s = 0
flg_t = 1
elif u == 2:
flg_s = 1
flg_t = 0
else:
flg_s = 0
flg_t = 0
for j in range(N):
a = idx(s, j, flg_s)
b = idx(j, t, flg_t)
if a > N*N:
adj[a - N*N].append(b)
adj_rev[b].append(a - N*N)
else:
adj[a + N*N].append(b)
adj_rev[b].append(a + N*N)
if b > N*N:
adj[b - N*N].append(a)
adj_rev[a].append(b - N*N)
else:
adj[b + N*N].append(a)
adj_rev[a].append(b + N*N)
_, G_idx = SCC(adj, adj_rev)
for v in range(1, N*N+1):
v_ = v + N*N
if G_idx[v] == G_idx[v_]:
fin()
ans = [[0] * N for _ in range(N)]
for i in range(N):
for j in range(N):
v = idx(i, j, 0)
v_ = idx(i, j, 1)
if G_idx[v] < G_idx[v_]:
ans[i][j] = 1
for i in range(N):
print(*ans[i])
# check
for i in range(N):
s = S[i] - 1
t = T[i] - 1
u = U[i]
for j in range(N):
if u == ans[s][j] + ans[j][t] * 2:
assert False
if __name__ == '__main__':
main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0