結果
| 問題 |
No.1451 集団登校
|
| コンテスト | |
| ユーザー |
nasubi24
|
| 提出日時 | 2021-03-31 15:18:28 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 521 ms / 2,000 ms |
| コード長 | 1,462 bytes |
| コンパイル時間 | 1,171 ms |
| コンパイル使用メモリ | 82,036 KB |
| 実行使用メモリ | 95,244 KB |
| 最終ジャッジ日時 | 2024-12-14 23:34:40 |
| 合計ジャッジ時間 | 9,574 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
class UnionFindBySize():
def __init__(self, n):
self.parents = list(range(n))
self.size = [1] * n
def find(self, x):
if self.parents[x] == x:
return x
else:
self.parents[x] = self.find(self.parents[x])
return self.parents[x]
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if x == y:
return
if self.size[x] < self.size[y]:
self.size[y] += self.size[x]
self.parents[x] = y
else:
self.size[x] += self.size[y]
self.parents[y] = x
n,m=map(int,input().split())
mod=10**9+7
uf=UnionFindBySize(n)
num2=pow(2,mod-2,mod)
ans=[0]*n
size=[1]*n
memo=[[_] for _ in range(n)]
for i in range(m):
a,b=map(int,input().split())
a-=1
b-=1
e=uf.find(a)
f=uf.find(b)
c=size[e]
d=size[f]
if e!=f:
if c>d:
for j in range(len(memo[f])):
ans[memo[f][j]]=-1
memo[f]=[]
size[e]+=size[f]
elif d>c:
for j in range(len(memo[e])):
ans[memo[e][j]]=-1
memo[e]=[]
size[f]+=size[e]
else:
memo[e]+=memo[f]
memo[f]=[]
for j in range(len(memo[e])):
ans[memo[e][j]]+=1
size[e]*=2
uf.union(a,b)
for i in ans:
if i==-1:
print(0)
else:
print(pow(num2,i,mod))
nasubi24