結果
問題 | No.1153 ねこちゃんゲーム |
ユーザー |
![]() |
提出日時 | 2023-12-16 02:04:12 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 11,810 bytes |
コンパイル時間 | 402 ms |
コンパイル使用メモリ | 82,404 KB |
実行使用メモリ | 335,060 KB |
最終ジャッジ日時 | 2024-09-27 07:02:59 |
合計ジャッジ時間 | 75,016 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 2 |
other | WA * 40 |
ソースコード
import sysreadline=sys.stdin.readlineclass Graph:def __init__(self,V,edges=None,graph=None,directed=False,weighted=False,inf=float("inf")):self.V=Vself.directed=directedself.weighted=weightedself.inf=infif graph!=None:self.graph=graph"""self.edges=[]for i in range(self.V):if self.weighted:for j,d in self.graph[i]:if self.directed or not self.directed and i<=j:self.edges.append((i,j,d))else:for j in self.graph[i]:if self.directed or not self.directed and i<=j:self.edges.append((i,j))"""else:self.edges=edgesself.graph=[[] for i in range(self.V)]if weighted:for i,j,d in self.edges:self.graph[i].append((j,d))if not self.directed:self.graph[j].append((i,d))else:for i,j in self.edges:self.graph[i].append(j)if not self.directed:self.graph[j].append(i)def SIV_DFS(self,s,bipartite_graph=False,cycle_detection=False,directed_acyclic=False,euler_tour=False,linked_components=False,lowlink=False,parents=False,postorder=False,preorder=False,subtree_size=False,topological_sort=False,unweighted_dist=False,weighted_dist=False):seen=[False]*self.Vfinished=[False]*self.Vif directed_acyclic or cycle_detection or topological_sort:dag=Trueif euler_tour:et=[]if linked_components:lc=[]if lowlink:order=[None]*self.Vll=[None]*self.Vidx=0if parents or cycle_detection or lowlink or subtree_size:ps=[None]*self.Vif postorder or topological_sort:post=[]if preorder:pre=[]if subtree_size:ss=[1]*self.Vif unweighted_dist or bipartite_graph:uwd=[self.inf]*self.Vuwd[s]=0if weighted_dist:wd=[self.inf]*self.Vwd[s]=0stack=[(s,0)] if self.weighted else [s]while stack:if self.weighted:x,d=stack.pop()else:x=stack.pop()if not seen[x]:seen[x]=Truestack.append((x,d) if self.weighted else x)if euler_tour:et.append(x)if linked_components:lc.append(x)if lowlink:order[x]=idxll[x]=idxidx+=1if preorder:pre.append(x)for y in self.graph[x]:if self.weighted:y,d=yif not seen[y]:stack.append((y,d) if self.weighted else y)if parents or cycle_detection or lowlink or subtree_size:ps[y]=xif unweighted_dist or bipartite_graph:uwd[y]=uwd[x]+1if weighted_dist:wd[y]=wd[x]+delif not finished[y]:if (directed_acyclic or cycle_detection or topological_sort) and dag:dag=Falseif cycle_detection:cd=(y,x)elif not finished[x]:finished[x]=Trueif euler_tour:et.append(~x)if lowlink:bl=Truefor y in self.graph[x]:if self.weighted:y,d=yif ps[x]==y and bl:bl=Falsecontinuell[x]=min(ll[x],order[y])if x!=s:ll[ps[x]]=min(ll[ps[x]],ll[x])if postorder or topological_sort:post.append(x)if subtree_size:for y in self.graph[x]:if self.weighted:y,d=yif y==ps[x]:continuess[x]+=ss[y]if bipartite_graph:bg=[[],[]]for tpl in self.edges:x,y=tpl[:2] if self.weighted else tplif uwd[x]==self.inf or uwd[y]==self.inf:continueif not uwd[x]%2^uwd[y]%2:bg=Falsebreakelse:for x in range(self.V):if uwd[x]==self.inf:continuebg[uwd[x]%2].append(x)retu=()if bipartite_graph:retu+=(bg,)if cycle_detection:if dag:cd=[]else:y,x=cdcd=self.Route_Restoration(y,x,ps)retu+=(cd,)if directed_acyclic:retu+=(dag,)if euler_tour:retu+=(et,)if linked_components:retu+=(lc,)if lowlink:retu=(ll,)if parents:retu+=(ps,)if postorder:retu+=(post,)if preorder:retu+=(pre,)if subtree_size:retu+=(ss,)if topological_sort:if dag:tp_sort=post[::-1]else:tp_sort=[]retu+=(tp_sort,)if unweighted_dist:retu+=(uwd,)if weighted_dist:retu+=(wd,)if len(retu)==1:retu=retu[0]return retudef Build_Rerooting(self,s,f,f_merge,subtree=False):self.rerooting_s=sself.rerooting_f=fself.rerooting_f_merge=f_mergeself.subtree=subtreeif self.subtree:parents,postorder,preorder,self.rerooting_depth=self.SIV_DFS(s,parents=True,postorder=True,preorder=True,unweighted_dist=True)parents[s]=sself.rerooting_PD=Path_Doubling(self.V,parents)self.rerooting_PD.Build_Next()parents[s]=Noneelse:parents,postorder,preorder=self.SIV_DFS(s,parents=True,postorder=True,preorder=True)self.rerooting_lower_dp=[None]*self.Vfor x in postorder:children=[y[0] if self.weighted else y for y in self.graph[x] if (y[0] if self.weighted else y)!=parents[x]]self.rerooting_lower_dp[x]=self.rerooting_f_merge(x,[self.rerooting_f(y,self.rerooting_lower_dp[y]) for y in children])self.rerooting_upper_dp=[None]*self.Vfor x in preorder:children=[y[0] if self.weighted else y for y in self.graph[x] if (y[0] if self.weighted else y)!=parents[x]]left_accumule_f=[None]*(len(children)+1)right_accumule_f=[None]*(len(children)+1)left_accumule_f[0]=self.rerooting_f_merge(x,[])for i in range(1,len(children)+1):left_accumule_f[i]=self.rerooting_f_merge(x,[left_accumule_f[i-1],self.rerooting_f(children[i-1],self.rerooting_lower_dp[children[i-1]])])right_accumule_f[len(children)]=self.rerooting_f_merge(x,[])for i in range(len(children)-1,-1,-1):right_accumule_f[i]=self.rerooting_f_merge(x,[right_accumule_f[i+1],self.rerooting_f(children[i],self.rerooting_lower_dp[children[i]])])for i in range(len(children)):if parents[x]==None:self.rerooting_upper_dp[children[i]]=self.rerooting_f(x,self.rerooting_f_merge(x,[left_accumule_f[i],right_accumule_f[i+1]]))else:self.rerooting_upper_dp[children[i]]=self.rerooting_f(x,self.rerooting_f_merge(x,[left_accumule_f[i],right_accumule_f[i+1],self.rerooting_upper_dp[x]]))if self.subtree:self.rerooting_parents=parentsdef Rerooting(self,root,subtree=None):assert self.subtree or subtree==Noneif self.subtree and root!=subtree:if self.rerooting_depth[subtree]>=self.rerooting_depth[root]:x=self.rerooting_parents[subtree]else:x=self.rerooting_PD.Permutation_Doubling(root,self.rerooting_depth[root]-self.rerooting_depth[subtree]-1)if self.rerooting_parents[x]!=subtree:x=self.rerooting_parents[subtree]if self.rerooting_parents[subtree]==x:retu=self.rerooting_f(subtree,self.rerooting_lower_dp[subtree])else:retu=self.rerooting_upper_dp[x]else:if root==self.rerooting_s:retu=self.rerooting_f(root,self.rerooting_lower_dp[root])else:retu=self.rerooting_f(root,self.rerooting_f_merge(root,[self.rerooting_lower_dp[root],self.rerooting_upper_dp[root]]))return retuclass Path_Doubling:def __init__(self,N,permutation,lst=None,f=None,e=None):self.N=Nself.permutation=permutationself.lst=lstself.f=fself.e=edef Build_Next(self,K=None):if K==None:K=self.Nself.k=K.bit_length()self.permutation_doubling=[[None]*self.N for k in range(self.k)]for n in range(self.N):self.permutation_doubling[0][n]=self.permutation[n]if self.lst!=None:self.doubling=[[None]*self.N for k in range(self.k)]for n in range(self.N):self.doubling[0][n]=self.lst[n]for k in range(1,self.k):for n in range(self.N):if self.permutation_doubling[k-1][n]!=None:self.permutation_doubling[k][n]=self.permutation_doubling[k-1][self.permutation_doubling[k-1][n]]if self.f!=None:self.doubling[k][n]=self.f(self.doubling[n][k-1],self.doubling[k-1][self.permutation_doubling[k-1][n]])def Permutation_Doubling(self,N,K):if K<0 or 1<<self.k<=K:return Nonefor k in range(self.k):if K>>k&1 and N!=None:N=self.permutation_doubling[k][N]return Ndef Doubling(self,N,K):if K<0:return self.eretu=self.efor k in range(self.k):if K>>k&1:if self.permutation_doubling[k][N]==None:return Noneretu=self.f(retu,self.doubling[k][N])N=self.permutation_doubling[k][N]return N,retudef Bisect(self,x,is_ok):if not is_ok(x):return -1,NoneK=0for k in range(self.k-1,-1,-1):if is_ok(self.permutation_doubling[k][x]):K|=1<<kx=self.permutation_doubling[k][x]return K,xN,M=map(int,readline().split())A=list(map(int,readline().split()))B=20for m in range(M):A[m]-=1edges=[]for n in range(N-1):u,v=map(int,readline().split())u-=1;v-=1edges.append((u,v))G=Graph(N,edges=edges)def f(x,merged_a):g=0while merged_a[g]:g+=1retu=[0]*Bretu[g]=1return retudef f_merge(x,lst):retu=[0]*Bfor cnt in lst:for i in range(B):retu[i]|=cnt[i]return retuG.Build_Rerooting(0,f,f_merge,subtree=True)