View on GitHub

cp-library

range add count top k

C++ 用ライブラリ一覧に戻る

ソースコード

nachia/range-query/range-add-count-top-k.hpp

主な機能

配列 $(a[0],a[1],\ldots ,a[n])$ に対して、次の計算を高速化する。

構造体テンプレート RangeAddCountTopK

テンプレート引数

template<class Elem = long long, class Freq = long long, class Compare = std::less<Elem>>
struct RangeAddCountTopK;

要素の型 Elem と、頻度の型 Freq と比較関数の型 Compare を与える。 Freq は整数型であることを想定している。 Comparestd::greater を指定するためにある。

コンストラクタ

RangeAddCountTopK(Compare cmp = Compare());   // (0)
RangeAddCountTopK(                            // (1)
    int n, int k,
    Elem fillV, Freq fillF,
    Elem Min, Freq fZero = Freq(0),
    Compare cmp = Compare()
);

以降では Min を $-\infty$ と表記する。

rangeAdd

void rangeAdd(int l, int r, Elem x);

各要素に $x$ を足す。

min

std::vector<Node> rangeTopK(int l, int r);  // (1)
std::vector<Node> topK();                   // (2)

(1) : 返り値の $i$ 番目の要素は、大きいほうから $k$ 種類目の値 $x$ とその重み和 $f$ の組 $(x,f)$ 。 $k$ 種類目が存在しない場合 $(x,f)=(-\infty,0)$ である。

(2) : $l=0,r=n$ と等価。 $O(k)$ 時間。

参考

ABC248Ex - Beautiful Subsequences


TOP PAGE