結果
問題 | No.1078 I love Matrix Construction |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
mod = 1000000007eps = 10**-9def main():import sysfrom collections import dequeinput = sys.stdin.readlinefrom collections import deque# compressed[v]: 縮約後のグラフで縮約前のvが属する頂点# num: 縮約後のグラフの頂点数def SCC(adj, adj_rev):N = len(adj) - 1seen = [0] * (N + 1)compressed = [0] * (N + 1)order = []for v0 in range(1, N + 1):if seen[v0]:continuest = deque()st.append(v0)while st:v = st.pop()if v < 0:order.append(-v)else:if seen[v]:continueseen[v] = 1st.append(-v)for u in adj[v]:st.append(u)seen = [0] * (N + 1)num = 0for v0 in reversed(order):if seen[v0]:continuenum += 1st = deque()st.append(v0)seen[v0] = 1compressed[v0] = numwhile st:v = st.pop()for u in adj_rev[v]:if seen[u]:continueseen[u] = 1compressed[u] = numst.append(u)return num, compressed# 縮約後のグラフを構築# 先にSCC()を実行してnum, compressedを作っておくdef construct(adj, num, compressed):N = len(adj) - 1adj_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_compresseddef 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*Nadj = [[] for _ in range(N*N*2 + 1)]adj_rev = [[] for _ in range(N * N * 2 + 1)]for i in range(N):s = S[i] - 1t = T[i] - 1u = U[i]if u == 0:flg_s = 1flg_t = 1elif u == 1:flg_s = 0flg_t = 1elif u == 2:flg_s = 1flg_t = 0else:flg_s = 0flg_t = 0for 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*Nif 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] = 1for i in range(N):print(*ans[i])# checkfor i in range(N):s = S[i] - 1t = T[i] - 1u = U[i]for j in range(N):if u == ans[s][j] + ans[j][t] * 2:assert Falseif __name__ == '__main__':main()