Neterukun's Library

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

View the Project on GitHub Neterukun1993/Library

:heavy_check_mark: TestCase/LibraryChecker/persistent_unionfind.Undo.test.py

Depends on

Code

# verification-helper: PROBLEM https://judge.yosupo.jp/problem/persistent_unionfind
import sys
input = sys.stdin.buffer.readline

from DataStructure.UnionFind.UnionFindUndo import UnionFindUndo


def main():    
    """クエリ先読みによって、merge時に参照/生成されるグラフ間に辺を貼り、
    木を構築する。その後オフラインダイコネと同様の要領でシミュレートする。
    """
    n, q = map(int, input().split())
    queries = [list(map(int, input().split())) for i in range(q)]

    tree = [[] for i in range(q)]
    judges = {}
    merges = {}
    for i, (flag, k, u, v) in enumerate(queries):
        if k == -1:
            k = q - 1
        if flag == 0:
            if i == q - 1:
                continue
            tree[i].append(k)
            tree[k].append(i)
            merges[i] = (u, v)
        else:
            if k not in judges:
                judges[k] = []
            judges[k].append((i, u, v))

    root = q - 1
    visited = [False] * q
    visited[root] = True
    idxs = [0] * q
    stack = [root]

    # TODO: 木上の巡回をオイラーツアーとしてライブラリにする
    order = []
    while True:
        v = stack.pop()
        idx = idxs[v]
        if idx == len(tree[v]):
            break
        if idx == 0:
            order.append(v)
        if visited[tree[v][idx]] and idx == len(tree[v]) - 1:
            order.append(v)
            stack.append(tree[v][idx])
            tree[v][idx] += 1
            continue
        if visited[tree[v][idx]]:
            tree[v][idx], tree[v][idx + 1] = tree[v][idx + 1], tree[v][idx]
        visited[tree[v][idx]] = True
        stack.append(tree[v][idx])
        idxs[v] += 1

    ans = [-1] * q
    visited = [False] * q
    uf = UnionFindUndo(n)
    for i in order:
        if i in merges:
            if visited[i]:
                uf.undo()
                continue
            else:
                visited[i] = True
                uf.merge(*merges[i])
        if i in judges:
            for j, u, v in judges[i]:
                ans[j] = int(uf.same(u, v))

    print('\n'.join(map(str, [res for res in ans if res != -1])))


if __name__ == '__main__':
    main()
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