Neterukun's Library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Neterukun1993/Library

:heavy_check_mark: 永続 Union Find
(DataStructure/UnionFind/PersistentUnionFind.py)

概要

永続化された素集合データ構造。つまり、merge 前後のバージョンを常に保持し、全バージョンに対する samesize が可能である。

使い方

PersistentUnionFind(n: int)
$x = 0, 1, 2, \dots, n - 1$ に対して要素 $x$ の代表元が $x$ となるように、$n$ 個の素集合を構築する。計算量 $O(n \log n)$

Depends on

Verified with

Code

from DataStructure.misc.PersistentArray import (
    PersistentArray,
    init_persistent_array
)


class PersistentUnionFind:
    def __init__(self, n):
        if type(n) is int:
            self.parent = init_persistent_array([-1 for _ in range(n)])
        else:
            self.parent = n

    def root(self, x):
        px = self.parent.get(x)
        if px < 0:
            return x
        return self.root(px)

    def merge(self, x, y):
        x, y = self.root(x), self.root(y)
        if x == y:
            return self
        px = self.parent.get(x)
        py = self.parent.get(y)
        if px > py:
            x, y = y, x
        tmp = self.parent.set(y, x)
        return PersistentUnionFind(tmp.set(x, px + py))

    def same(self, x, y):
        return self.root(x) == self.root(y)

    def size(self, x):
        return -self.parent.get(self.root(x))
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.12.4/x64/lib/python3.12/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
    bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.12.4/x64/lib/python3.12/site-packages/onlinejudge_verify/languages/python.py", line 96, in bundle
    raise NotImplementedError
NotImplementedError
Back to top page