結果
問題 | No.1451 集団登校 |
ユーザー | ygd. |
提出日時 | 2021-03-31 16:02:51 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,251 bytes |
コンパイル時間 | 374 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 424,756 KB |
最終ジャッジ日時 | 2024-12-15 02:26:00 |
合計ジャッジ時間 | 35,303 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 44 ms
59,264 KB |
testcase_01 | AC | 44 ms
317,688 KB |
testcase_02 | AC | 43 ms
59,776 KB |
testcase_03 | AC | 45 ms
160,640 KB |
testcase_04 | AC | 45 ms
59,392 KB |
testcase_05 | AC | 44 ms
326,224 KB |
testcase_06 | AC | 47 ms
59,648 KB |
testcase_07 | AC | 44 ms
143,660 KB |
testcase_08 | AC | 373 ms
195,888 KB |
testcase_09 | AC | 43 ms
267,024 KB |
testcase_10 | AC | 272 ms
125,796 KB |
testcase_11 | AC | 130 ms
356,436 KB |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | TLE | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | TLE | - |
testcase_18 | WA | - |
testcase_19 | AC | 97 ms
96,160 KB |
testcase_20 | TLE | - |
testcase_21 | TLE | - |
testcase_22 | TLE | - |
testcase_23 | WA | - |
testcase_24 | AC | 256 ms
117,044 KB |
testcase_25 | TLE | - |
testcase_26 | WA | - |
testcase_27 | TLE | - |
testcase_28 | TLE | - |
testcase_29 | TLE | - |
ソースコード
class UnionFind(object): def __init__(self, n=1): self.par = [i for i in range(n)] self.rank = [0 for _ in range(n)] self.size = [1 for _ in range(n)] def find(self, x): """ x が属するグループを探索して親を出す。 """ if self.par[x] == x: return x else: self.par[x] = self.find(self.par[x]) return self.par[x] def union(self, x, y): """ x と y のグループを結合 """ x = self.find(x) y = self.find(y) if x != y: if self.rank[x] < self.rank[y]: x, y = y, x if self.rank[x] == self.rank[y]: self.rank[x] += 1 self.par[y] = x self.size[x] += self.size[y] def is_same(self, x, y): """ x と y が同じグループか否か """ return self.find(x) == self.find(y) def get_size(self, x): """ x が属するグループの要素数 """ x = self.find(x) return self.size[x] from collections import defaultdict N,M = map(int,input().split()); MOD = pow(10,9)+7 half = pow(2,MOD-2,MOD) A =[]; B =[] for _ in range(M): a,b = map(int,input().split()) a-=1;b-=1 #0-index A.append(a);B.append(b) uf = UnionFind(N) dic = defaultdict(set) ans = [1]*N for i in range(N): dic[i].add(i) zero = set([]) for i in range(M): a_par = uf.find(A[i]) b_par = uf.find(B[i]) if uf.get_size(A[i]) > uf.get_size(B[i]): for b in dic[b_par]: ans[b] = 0 dic[a_par] = dic[a_par].union(dic[b_par]) elif uf.get_size(B[i]) > uf.get_size(A[i]): for a in dic[a_par]: ans[a] = 0 dic[b_par] = dic[b_par].union(dic[a_par]) else: #print(uf.get_size(A[i]),uf.get_size(B[i])) #print(dic[a_par],dic[b_par]) for x in dic[a_par]: ans[x] *= half; ans[x] %= MOD for x in dic[b_par]: ans[x] *= half; ans[x] %= MOD dic[a_par] = dic[a_par].union(dic[b_par]) dic[b_par] = dic[b_par].union(dic[a_par]) uf.union(A[i],B[i]) #print(dic) #print(A[i],B[i],ans) print(*ans,sep="\n")