結果
問題 | No.1054 Union add query |
ユーザー | persimmon-persimmon |
提出日時 | 2021-06-26 13:21:11 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 751 ms / 2,000 ms |
コード長 | 2,151 bytes |
コンパイル時間 | 149 ms |
コンパイル使用メモリ | 82,484 KB |
実行使用メモリ | 158,288 KB |
最終ジャッジ日時 | 2024-06-25 09:03:03 |
合計ジャッジ時間 | 7,800 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 39 ms
52,936 KB |
testcase_01 | AC | 39 ms
53,392 KB |
testcase_02 | AC | 39 ms
53,900 KB |
testcase_03 | AC | 751 ms
147,508 KB |
testcase_04 | AC | 722 ms
153,300 KB |
testcase_05 | AC | 730 ms
146,604 KB |
testcase_06 | AC | 642 ms
145,188 KB |
testcase_07 | AC | 593 ms
145,140 KB |
testcase_08 | AC | 615 ms
139,436 KB |
testcase_09 | AC | 613 ms
158,288 KB |
testcase_10 | AC | 503 ms
139,268 KB |
ソースコード
import sys inpu=sys.stdin.readline # UnionFind class UnionFind: def __init__(self,n): self.n=n self.par=[-1]*n # par[i]:i根ならグループiの要素数に-1をかけたもの。i根じゃないならiの親 self.rank=[0]*n self.p=[0]*n # iの根を返す def find(self,i): if self.par[i]<0:return i ii=i while self.par[i]>=0: i=self.par[i] #while i!=self.par[ii]: # ii,self.par[ii]=self.par[ii],i return i def find0(self,i): if self.par[i]<0:return i,self.p[i] ii=i point=self.p[i] while self.par[i]>=0: i=self.par[i] point+=self.p[i] #while i!=self.par[ii]: # ii,self.par[ii]=self.par[ii],i return i,point # iとjをunionし、根頂点を返す def union(self,i,j): i,j=self.find(i),self.find(j) if i==j:return i elif self.rank[i]>self.rank[j]: # par[i]:グループiの要素数で判断してもいい self.par[i]+=self.par[j] self.par[j]=i self.p[j]-=self.p[i] else: self.par[j]+=self.par[i] self.par[i]=j self.p[i]-=self.p[j] # 深さ(rank)が同じものを併合した場合1を足す if self.rank[i]==self.rank[j]: self.rank[j]+=1 return self.find(i) # iとjが同じグループに属するか判断 def same(self,i,j): return self.find(i)==self.find(j) # ノードiが属する木のサイズを返す def size(self,i): return -self.par[self.find(i)] def main0(n,q,tab): uf=UnionFind(n) mat=[0]*n ret=[] for t,a,b in tab: if t==1: uf.union(a-1,b-1) elif t==2: for v in range(n): if uf.same(a-1,v): mat[v]+=b else: ret.append(mat[a-1]) return ret def main1(n,q,tab): uf=UnionFind(n) ret=[] for t,a,b in tab: if t==1: uf.union(a-1,b-1) elif t==2: id=uf.find(a-1) uf.p[id]+=b else: id,tmp=uf.find0(a-1) ret.append(tmp) return ret if __name__=='__main__': n,q=map(int,input().split()) tab=[list(map(int,input().split())) for _ in range(q)] #ret0=main0(n,q,tab) ret1=main1(n,q,tab) #print(ret0) print(*ret1,sep="\n")