Neterukun's Library

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

View the Project on GitHub Neterukun1993/Library

:heavy_check_mark: Foldable Queue
(DataStructure/misc/FoldableQueue.py)

概要

キューの操作をサポートし、キュー全体の畳み込みを $O(1)$ で行えるデータ構造。畳み込みは半群を要請する。

使い方

SlidingWindowAggregation(op: Callable[[Any, Any], Any])
空のキューを構築する。op は畳み込みの二項演算。計算量 $O(1)$

Verified with

Code

class FoldableQueue:
    def __init__(self, op):
        self.op = op
        self.inque = []
        self.outque = []

    def __len__(self):
        return len(self.outque) + len(self.inque)

    def _trans(self):
        val, _ = self.inque.pop()
        self.outque.append((val, val))
        acc = val
        while self.inque:
            val, _ = self.inque.pop()
            acc = self.op(val, acc)
            self.outque.append((val, acc))

    def all_fold(self):
        if not self.inque:
            return self.outque[-1][1]
        if not self.outque:
            return self.inque[-1][1]
        return self.op(self.outque[-1][1], self.inque[-1][1])

    def append(self, val):
        if self.inque:
            self.inque.append((val, self.op(self.inque[-1][1], val)))
        else:
            self.inque.append((val, val))

    def popleft(self):
        if not self.outque:
            self._trans()
        val = self.outque.pop()
        return val[0]
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