結果
問題 | No.2991 Hypercubic Graph Flow |
ユーザー |
|
提出日時 | 2024-12-16 00:26:07 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 156 ms / 2,000 ms |
コード長 | 3,247 bytes |
コンパイル時間 | 179 ms |
コンパイル使用メモリ | 82,240 KB |
実行使用メモリ | 88,112 KB |
最終ジャッジ日時 | 2024-12-16 00:26:09 |
合計ジャッジ時間 | 2,048 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 10 |
ソースコード
import sys,timefrom itertools import permutationsfrom heapq import heappop,heappushfrom collections import dequeimport randomimport bisectfrom math import log,gcdinput = lambda :sys.stdin.readline().rstrip()mi = lambda :map(int,input().split())li = lambda :list(mi())def find_euler_tour(N,M,edge):done_counter = [0] * Nused = [False] * Mvisit = [False] * Nres = []for start in range(N):if visit[start]:continuevisit[start] = Truest = [start]tmp_res = []while st:v = st[-1]visit[v] = Trueif done_counter[v] == len(edge[v]):tmp_res.append(v)st.pop()continuenv,eid = edge[v][done_counter[v]]done_counter[v] += 1if used[eid]:continueused[eid] = Truest.append(nv)res.append(tmp_res)return resdef solve(N):if N == 1:return ("No",[])if N & 1 == 0:edge = [[] for v in range(1<<N)]nxt_eid = 0for v in range(1<<N):for k in range(N):if v>>k & 1 == 0:edge[v].append((v^(1<<k),nxt_eid))edge[v^(1<<k)].append((v,nxt_eid))nxt_eid += 1euler_tour = find_euler_tour(1<<N,nxt_eid,edge)res = [[0]*(1<<N) for i in range(1<<N)]for ce in euler_tour:for u,v in zip(ce,ce[1:]):res[u][v] = 1res[v][u] = -1return ("Yes",res)else:edge = [[] for v in range(1<<N)]nxt_eid = 0for v in range(1<<N):for k in range(3,N):if v>>k & 1 == 0:edge[v].append((v^(1<<k),nxt_eid))edge[v^(1<<k)].append((v,nxt_eid))nxt_eid += 1euler_tour = find_euler_tour(1<<N,nxt_eid,edge)res = [[0]*(1<<N) for i in range(1<<N)]for ce in euler_tour:for u,v in zip(ce,ce[1:]):res[u][v] = 1res[v][u] = -1for root in range(0,1<<N,8):two_in = [0,3,5,6]two_out = [1,2,4,7]for a,b in zip(two_in,two_out):res[a^root][b^root] = -2res[b^root][a^root] = 2for a in two_in:for k in [2,4]:res[a^root][a^k^root] = 1res[a^k^root][a^root] = -1return ("Yes",res)def checker(N,res):for i in range(1<<N):for k in range(N):if res[i][i^(1<<k)] == 0:print(i,i^(1<<k))return Falsefor j in range(1<<N):d = i^jif (d & (d-1)) != 0 and res[i][j]!=0:return (False,"must 0")if sum(res[i])!=0:return (False,"sum")return TrueN = int(input())ans,res = solve(N)if ans == "Yes":print(ans)for i in range(1<<N):print(*res[i])else:print(ans)