結果
問題 |
No.1054 Union add query
|
ユーザー |
👑 ![]() |
提出日時 | 2020-05-15 22:24:05 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,288 bytes |
コンパイル時間 | 1,440 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 176,544 KB |
最終ジャッジ日時 | 2024-09-19 11:12:00 |
合計ジャッジ時間 | 5,733 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 6 TLE * 2 |
ソースコード
import bisect def uf_find(n,p,slis): allsum = 0 time = -1 while p[n] != n: ind = bisect.bisect_left(slis[n],(time,0)) - 1 allsum += slis[n][-1][1] - slis[n][ind][1] time = max(time , linktime[n]) n = p[n] ind = bisect.bisect_left(slis[n],(time,0)) - 1 allsum += slis[n][-1][1] - slis[n][ind][1] return n,allsum def uf_union(a,b,p,rank,slis): ap,tmp = uf_find(a,p,slis) bp,tmp = uf_find(b,p,slis) if ap == bp: return True else: if rank[ap] > rank[bp]: p[bp] = ap linktime[bp] = loop elif rank[ap] < rank[bp]: p[ap] = bp linktime[ap] = loop else: p[bp] = ap rank[ap] += 1 linktime[bp] = loop return False N,Q = map(int,input().split()) TAB = [] p = [i for i in range(N)] rank = [1] * N slis = [[(-2,0)] for i in range(N)] linktime = [-1] * N for loop in range(Q): t,a,b = map(int,input().split()) a -= 1 if t == 1: b -= 1 uf_union(a,b,p,rank,slis) elif t == 2: nowp,asum = uf_find(a,p,slis) slis[nowp].append((loop,slis[nowp][-1][1] + b)) else: nowp,asum = uf_find(a,p,slis) print (asum)