algo — C++23 日本語リファレンス GitHub

UndoSlopeTrick

クラス · Undo 可能 slope trick

template <class T>
struct UndoSlopeTrick;

概要

Undo 可能 slope trick

以下では $N$ を、これまでに行った add_x_minus_a / add_a_minus_x (add_abs は内部で両方呼ぶため 2 回分)の呼び出し回数とする

構築・破棄

名前 説明 計算量
(constructor) $f(x)=0$ の状態を構築する $O(1)$

メンバ関数

名前 説明 計算量
min_x 最小値を取る $x$ の 1 つを返す $O(1)$
min_value 関数の最小値を返す $O(1)$
add_const $f(x) \gets f(x) + a$ $O(1)$
add_x_minus_a $f(x) \gets f(x) + \max(0, x - a)$ $O(\log N)$
add_a_minus_x $f(x) \gets f(x) + \max(0, a - x)$ $O(\log N)$
add_abs $f(x) \gets f(x) + |x - a| = f(x) + \max(0, x - a) + \max(0, a - x)$ $O(\log N)$
undo 直前の add_* 操作の内部履歴を 1 件取り消す $O(\log N)$
snapshot 現在の状態を表す履歴位置を返す $O(1)$
rollback snapshot() で取得した時点まで巻き戻す 現在の履歴サイズを $h$ として $O((h - t) \log N)$