結果

問題 No.1054 Union add query
ユーザー maspymaspy
提出日時 2020-05-16 11:06:10
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,471 bytes
コンパイル時間 1,833 ms
コンパイル使用メモリ 81,604 KB
実行使用メモリ 231,228 KB
最終ジャッジ日時 2023-10-22 02:02:14
合計ジャッジ時間 11,204 ms
ジャッジサーバーID
(参考情報)
judge10 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 36 ms
53,500 KB
testcase_01 AC 35 ms
53,500 KB
testcase_02 AC 34 ms
53,500 KB
testcase_03 TLE -
testcase_04 AC 1,822 ms
231,228 KB
testcase_05 AC 1,689 ms
181,944 KB
testcase_06 AC 779 ms
195,636 KB
testcase_07 AC 680 ms
194,892 KB
testcase_08 AC 756 ms
194,308 KB
testcase_09 AC 762 ms
215,536 KB
testcase_10 AC 612 ms
211,396 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