Neterukun's Library

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

View the Project on GitHub Neterukun1993/Library

:heavy_check_mark: オイラーツアー (パスに対するクエリ)
(Graph/Tree/EulerTourPathQuery.py)

概要

オイラーツアーを行い、パスに対する一点加算、区間和取得を行うアルゴリズム。

使い方

EulerTourPathQuery(tree: Sequence[Iterable[int]])
隣接リストで表現される木 tree に対してオイラーツアーを行う。同時に一点加算、区間和取得用の Binary Indexed Tree を初期構築する。計算量 $O(V\log V)$

Depends on

Verified with

Code

from DataStructure.BinaryIndexedTree.PointAddRangeSum import BinaryIndexedTree
from Graph.Tree.EulerTour import EulerTour


class EulerTourPathQuery(EulerTour):
    def __init__(self, tree):
        super().__init__(tree, root=0)
        self.n = len(tree)
        self.bit = BinaryIndexedTree(2 * self.n)

    def build(self, vals):
        array = [0] * (2 * self.n)
        for i, idx in enumerate(self.begin):
            array[idx] = vals[i]
        for i, idx in enumerate(self.end):
            array[idx] = -vals[i]
        self.bit.build(array)

    def add(self, v, val):
        self.bit.add(self.begin[v], val)
        self.bit.add(self.end[v], -val)

    def vertex_path_sum(self, u, v):
        lca_uv = self.lca(u, v)
        res = self.bit.sum(self.begin[lca_uv], self.begin[u] + 1) \
            + self.bit.sum(self.begin[lca_uv] + 1, self.begin[v] + 1)
        return res

    def edge_path_sum(self, u, v):
        lca_uv = self.lca(u, v)
        res = self.bit.sum(self.begin[lca_uv] + 1, self.begin[u] + 1) \
            + self.bit.sum(self.begin[lca_uv] + 1, self.begin[v] + 1)
        return res
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