結果

問題 No.1054 Union add query
ユーザー maspymaspy
提出日時 2020-05-16 11:06:10
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,471 bytes
コンパイル時間 309 ms
コンパイル使用メモリ 82,560 KB
実行使用メモリ 231,360 KB
最終ジャッジ日時 2024-09-22 03:43:32
合計ジャッジ時間 11,269 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 35 ms
53,380 KB
testcase_01 AC 36 ms
54,140 KB
testcase_02 AC 36 ms
52,804 KB
testcase_03 TLE -
testcase_04 AC 1,842 ms
231,360 KB
testcase_05 AC 1,611 ms
181,760 KB
testcase_06 AC 829 ms
196,096 KB
testcase_07 AC 740 ms
195,772 KB
testcase_08 AC 809 ms
194,904 KB
testcase_09 AC 816 ms
216,172 KB
testcase_10 AC 647 ms
211,760 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

class UnionFind:
    def __init__(self, N):
        self.root = list(range(N))
        self.size = [1] * (N)
        self.comp = [[v] for v in range(N)]
        self.comp_val = [0] * N
        self.val = [0] * N

    def find_root(self, x):
        root = self.root
        while root[x] != x:
            root[x] = root[root[x]]
            x = root[x]
        return x

    def merge(self, x, y):
        x = self.find_root(x)
        y = self.find_root(y)
        if x == y:
            return False
        sx, sy = self.size[x], self.size[y]
        if sx < sy:
            x, y = y, x
        # x が大きい
        self.size[x] += sy
        self.root[y] = x
        for v in self.comp[y]:
            self.val[v] += self.comp_val[y] - self.comp_val[x]
        self.comp[x] += self.comp[y]
        self.comp[y].clear()

    def get_val(self, v):
        r = self.find_root(v)
        return self.val[v] + self.comp_val[r]

    def add_to_comp(self, v, x):
        r = self.find_root(v)
        self.comp_val[r] += x

def solve():
    N, Q = map(int, readline().split())
    m = map(int, read().split())
    uf = UnionFind(N + 1)
    for t, a, b in zip(m, m, m):
        if t == 1:
            uf.merge(a, b)
        elif t == 2:
            uf.add_to_comp(a, b)
        else:
            yield uf.get_val(a)

print('\n'.join(map(str, solve())))
0