結果
問題 | No.2563 色ごとのグループ |
ユーザー |
|
提出日時 | 2023-12-02 15:18:55 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 804 ms / 2,000 ms |
コード長 | 2,766 bytes |
コンパイル時間 | 436 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 173,332 KB |
最終ジャッジ日時 | 2024-09-26 18:27:51 |
合計ジャッジ時間 | 10,852 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 35 |
ソースコード
class Input_kyopro:def II(self): return int(input())def MI(self): return map(int,input().split())def MS(self): return map(str,input().split())def LMI(self): return list(self.MI())def LMS(self): return list(self.MS())def LLI(self,N): return [self.LMI() for _ in range(N)]def LLS(self,N): return [self.LMS() for _ in range(N)]def LS(self,N): return [input() for _ in range(N)]def LSL(self,N): return [list(input()) for _ in range(N)]def LI(self,N): return [self.II() for _ in range(N)]I=Input_kyopro()#入力import bisect,copyclass unionfind:def __init__(self,N):self.par=[-1]*(N+1)self.siz=[1]*(N+1)self.max_siz=1self.group=Ndef root(self,x):while True:if self.par[x]==-1:breakx=self.par[x]return xdef unite(self,u,v):RootU=self.root(u)RootV=self.root(v)if RootU==RootV:returnself.group-=1if self.siz[RootU]<self.siz[RootV]:self.par[RootU]=RootVself.siz[RootV]=self.siz[RootU]+self.siz[RootV]self.max_siz=max(self.max_siz,self.siz[RootV])else:self.par[RootV]=RootUself.siz[RootU]=self.siz[RootU]+self.siz[RootV]self.max_siz=max(self.max_siz,self.siz[RootV])def same(self,u,v):if self.root(u)==self.root(v):return Trueelse:return Falsedef Max_size(self):return self.max_sizdef group_count(self):return self.groupdef get_roots(self):return set(self.par)-{-1}def get_size(self,x):return self.siz[self.root(x)]class CC:def __init__(self):self.xs=[]self.builded=0def add(self,x):self.xs.append(x)def build(self):self.xs=list(set(self.xs))self.xs.sort()self.builded=1def index(self,x):if not self.builded:self.build()return bisect.bisect_right(self.xs,x)-1def __getitem__(self,item):if not self.builded:self.build()return self.xs[item]def size(self):if not self.builded:self.build()return len(self.xs)N,M=I.MI()C=I.LMI()uv=I.LLI(M)edge=[[] for _ in range(N)]for u,v in uv:if C[u-1]==C[v-1]:edge[C[u-1]-1].append((u,v))ans=0color=[[] for _ in range(N)]for i in range(N):color[C[i]-1].append(i+1)for i in range(N):cc=CC()for c in color[i]:cc.add(c)cc.build()uf=unionfind(cc.size())for u,v in edge[i]:uf.unite(cc.index(u),cc.index(v))a=uf.group_count()if a>=2:ans+=a-1print(ans)