Neterukun's Library

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

View the Project on GitHub Neterukun1993/Library

:heavy_check_mark: functional graph 上の (順列上の) ダブリング
(Graph/misc/Doubling.py)

概要

functional graph 上でダブリングを行う。

使い方

Doubling(permutation: List[int], power: int = 64)
$N$ 頂点の functional graph について、頂点 v から 頂点 permutation[v] への移動に関するダブリング配列を構築する。(1 << power) - 1 回が最大の移動回数となる。k = power としたとき、計算量 $O(kN)$

Verified with

Code

class Doubling:
    def __init__(self, permutation, power=64):
        self.n = len(permutation)
        self.perm = permutation
        self.power = power
        self._build()

    def _build(self):
        self.next = [[0] * self.n for i in range(self.power)]
        for v in range(self.n):
            self.next[0][v] = self.perm[v]
        for k in range(self.power - 1):
            for v in range(self.n):
                self.next[k + 1][v] = self.next[k][self.next[k][v]]

    def dest(self, v, times):
        for k in range(self.power):
            if (times >> k) & 1:
                v = self.next[k][v]
        return v

    def build_path(self, values, op=max, e=-10**18):
        self.op = op
        self.e = e
        self.data = [[e] * self.n for i in range(self.power)]
        for v in range(self.n):
            self.data[0][v] = self.op(self.e, values[v])
        for k in range(self.power - 1):
            for v in range(self.n):
                self.data[k + 1][v] = self.op(self.data[k][v],
                                              self.data[k][self.next[k][v]])

    def fold(self, v, times):
        res = self.e
        for k in range(self.power):
            if (times >> k) & 1:
                res = self.op(res, self.data[k][v])
                v = self.next[k][v]
        return res

    def max_times(self, v, f):
        res = self.e
        times = 0
        for k in reversed(range(self.power)):
            if f(self.op(res, self.data[k][v])):
                res = self.op(res, self.data[k][v])
                times += 1 << k
                v = self.next[k][v]
        return times
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