結果
問題 | No.2290 UnUnion Find |
ユーザー |
![]() |
提出日時 | 2023-05-05 21:48:10 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 797 ms / 2,000 ms |
コード長 | 1,766 bytes |
コンパイル時間 | 268 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 112,512 KB |
最終ジャッジ日時 | 2024-11-23 06:53:00 |
合計ジャッジ時間 | 33,562 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 46 |
ソースコード
class Unionfind:#根っこ参照で付け直し、デカイ木にちっさい木をつけるdef __init__(self,n):self.parent=[i for i in range(n)]#自分の親頂点の番号self.num=[1]*n#自分を根とする部分木の頂点の個数self.rank=[1]*n#自分を根とする部分木の高さdef find(self,i):if self.parent[i]==i:return ielse:self.parent[i]=self.find(self.parent[i])return self.parent[i]def union(self,i,j):a=self.find(i)b=self.find(j)if self.rank[a]>self.rank[b]:self.parent[b]=aself.num[a]+=self.num[b]elif self.rank[a]<self.rank[b]:self.parent[a]=bself.num[b]+=self.num[a]else:if a!=b:self.rank[a]+=1self.parent[b]=aself.num[a]+=self.num[b]def numb(self,i):#その頂点を含む連結成分の点の個数j=self.find(i)return self.num[j]s=set()N,Q=map(int,input().split())cnt_s=NU=Unionfind(N)for i in range(N):s.add(i)for _ in range(Q):query=list(map(int,input().split()))if query[0]==1:u,v=query[1:]u-=1v-=1a=U.find(u)b=U.find(v)if a!=b:U.union(u,v)if U.find(u)==a:s.remove(b)else:s.remove(a)cnt_s-=1else:u=query[1]u-=1if cnt_s==1:print(-1)else:a=s.pop()b=s.pop()if U.find(u)==a:print(b+1)else:print(a+1)s.add(a)s.add(b)