結果
問題 | No.1451 集団登校 |
ユーザー | ygd. |
提出日時 | 2021-03-31 16:13:34 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
(最新)
WA
(最初)
|
実行時間 | - |
コード長 | 2,265 bytes |
コンパイル時間 | 168 ms |
コンパイル使用メモリ | 82,364 KB |
実行使用メモリ | 1,582,196 KB |
最終ジャッジ日時 | 2024-12-15 02:59:51 |
合計ジャッジ時間 | 45,205 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | MLE | - |
testcase_01 | MLE | - |
testcase_02 | AC | 46 ms
62,668 KB |
testcase_03 | AC | 42 ms
251,956 KB |
testcase_04 | AC | 43 ms
61,972 KB |
testcase_05 | AC | 41 ms
157,084 KB |
testcase_06 | AC | 45 ms
61,680 KB |
testcase_07 | MLE | - |
testcase_08 | MLE | - |
testcase_09 | AC | 42 ms
62,172 KB |
testcase_10 | MLE | - |
testcase_11 | AC | 130 ms
125,084 KB |
testcase_12 | AC | 327 ms
118,748 KB |
testcase_13 | WA | - |
testcase_14 | TLE | - |
testcase_15 | MLE | - |
testcase_16 | MLE | - |
testcase_17 | TLE | - |
testcase_18 | WA | - |
testcase_19 | AC | 93 ms
96,040 KB |
testcase_20 | TLE | - |
testcase_21 | TLE | - |
testcase_22 | TLE | - |
testcase_23 | WA | - |
testcase_24 | AC | 259 ms
118,572 KB |
testcase_25 | TLE | - |
testcase_26 | TLE | - |
testcase_27 | TLE | - |
testcase_28 | TLE | - |
testcase_29 | MLE | - |
ソースコード
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) for i in range(M): a_par = uf.find(A[i]) b_par = uf.find(B[i]) if A[i] == B[i]: continue 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")