結果
| 問題 | No.1054 Union add query |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-20 01:51:16 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 603 ms / 2,000 ms |
| + 186µs | |
| コード長 | 1,791 bytes |
| 記録 | |
| コンパイル時間 | 233 ms |
| コンパイル使用メモリ | 95,980 KB |
| 実行使用メモリ | 178,236 KB |
| 最終ジャッジ日時 | 2026-07-20 01:51:23 |
| 合計ジャッジ時間 | 6,639 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 8 |
ソースコード
## https://yukicoder.me/problems/no/1054
class UnionFind:
"""
UnionFindの基本的な処理を実装したクラス
"""
def __init__(self, size):
self.root = [i for i in range(size)]
self.size = [1] * size
self.points = [0] * size
def get_root(self, v):
if v == self.root[v]:
return v
else:
old_root = self.root[v]
new_root = self.get_root(old_root)
return new_root
def get_point(self, v):
if self.root[v] == v:
return self.points[v]
else:
p = self.points[v]
root = self.root[v]
new_p = self.get_point(root)
return new_p + p
def merge(self, u, v):
root_u = self.get_root(u)
root_v = self.get_root(v)
if root_u == root_v:
return False
if self.size[root_u] >= self.size[root_v]:
self.size[root_u] += self.size[root_v]
self.points[root_v] -= self.points[root_u]
self.root[root_v] = root_u
else:
self.size[root_v] += self.size[root_u]
self.points[root_u] -= self.points[root_v]
self.root[root_u] = root_v
return True
def main():
N, Q = map(int, input().split())
tax = []
for _ in range(Q):
t, a, b = map(int, input().split())
tax.append((t, a, b))
uf = UnionFind(N)
for q_index in range(Q):
t, a, b = tax[q_index]
if t == 1:
uf.merge(a - 1, b - 1)
elif t == 2:
a -= 1
root_i = uf.get_root(a)
uf.points[root_i] += b
elif t == 3:
a -= 1
p = uf.get_point(a)
print(p)
if __name__ == "__main__":
main()