Neterukun's Library

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

View the Project on GitHub Neterukun1993/Library

:heavy_check_mark: 矩形和取得
(DataStructure/Wavelet/RectangleSum.py)

概要

二次元平面上の $n$ 個の重み付き点に対して、前計算を $O(n \log n)$ で行い、矩形範囲内の重み総和クエリに $O(\log n)$ で答えるデータ構造。内部では累積和を保持した Wavelet Matrix を構築する。

使い方

CompressedRectangleSum(points: Iterable[Tuple[int, int, int]])
二次元平面上の $n$ 個の重み付き点 points から Wavelet Matrix を構築する。各点は ($x$ 座標, $y$ 座標, 重み) で与えられる。計算量 $O(n \log n)$

Depends on

Verified with

Code

from DataStructure.Wavelet.BitVector import BitVector
from bisect import bisect_left


class RectangleSum:
    def __init__(self, ys, vals, MAXLOG=32):
        self.MAXLOG = MAXLOG
        self.n = len(vals)
        self.mat = []
        self.mid = []
        self.data = [[0] * (self.n + 1) for i in range(self.MAXLOG)]

        order = [i for i in range(self.n)]
        for d in reversed(range(self.MAXLOG)):
            vec = BitVector(self.n + 1)
            ls = []
            rs = []
            for i, od in enumerate(order):
                if ys[od] & (1 << d):
                    rs.append(od)
                    vec.set(i)
                else:
                    ls.append(od)
            vec.build()
            self.mat.append(vec)
            self.mid.append(len(ls))
            order = ls + rs
            for i, val in enumerate(order):
                self.data[- d - 1][i + 1] = self.data[- d - 1][i] + vals[val]

    def rect_sum(self, l, r, upper):
        res = 0
        for d in range(self.MAXLOG):
            if upper >> (self.MAXLOG - d - 1) & 1:
                res += self.data[d][self.mat[d].rank(r, 0)]
                res -= self.data[d][self.mat[d].rank(l, 0)]
                l = self.mat[d].rank(l, 1) + self.mid[d]
                r = self.mat[d].rank(r, 1) + self.mid[d]
            else:
                l = self.mat[d].rank(l, 0)
                r = self.mat[d].rank(r, 0)
        return res


class CompressedRectangleSum:
    def __init__(self, points):
        points = sorted(points)
        xs, ys, vals = zip(*points)
        self.xs = xs
        self.ys = sorted(set(ys))
        self.comp = {val: idx for idx, val in enumerate(self.ys)}
        ys = [self.comp[val] for val in ys]
        MAXLOG = len(self.ys).bit_length()
        self.mat = RectangleSum(ys, vals, MAXLOG)

    def rect_sum(self, l, r, lower, upper):
        l = bisect_left(self.xs, l)
        r = bisect_left(self.xs, r)
        lower = bisect_left(self.ys, lower)
        upper = bisect_left(self.ys, upper)
        return self.mat.rect_sum(l, r, upper) - self.mat.rect_sum(l, r, lower)
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