結果

問題 No.1054 Union add query
ユーザー maspymaspy
提出日時 2020-05-16 11:17:37
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
AC  
実行時間 1,640 ms / 2,000 ms
コード長 1,471 bytes
コンパイル時間 124 ms
コンパイル使用メモリ 12,008 KB
実行使用メモリ 170,644 KB
最終ジャッジ日時 2023-10-22 02:17:40
合計ジャッジ時間 9,372 ms
ジャッジサーバーID
(参考情報)
judge10 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 31 ms
10,268 KB
testcase_01 AC 31 ms
10,268 KB
testcase_02 AC 32 ms
10,268 KB
testcase_03 AC 1,029 ms
95,388 KB
testcase_04 AC 1,640 ms
170,644 KB
testcase_05 AC 803 ms
85,848 KB
testcase_06 AC 773 ms
100,480 KB
testcase_07 AC 701 ms
93,632 KB
testcase_08 AC 751 ms
102,056 KB
testcase_09 AC 1,120 ms
170,484 KB
testcase_10 AC 797 ms
135,276 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