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

convex_hull_trick

クラス · Convex Hull Trick (monotone)

template <class T, class Comp = std::less<T>>
struct convex_hull_trick;

概要

Convex Hull Trick (monotone)

直線 $ax+b$ を傾き単調順に add し、任意の $x$ における最小値(または最大値)を 二分探索で求める。最小値は Comp = std::less<>(既定)で傾きを単調減少順、 最大値は Comp = std::greater<> で傾きを単調増加順に add すること。 クエリ get(x) の $x$ は任意の順で与えてよい。

メンバ関数

名前 説明 計算量
add 直線 $ax+b$ を追加する(傾きは単調順) 償却 $O(1)$
get $x$ における最小値(または最大値) 直線数を $n$ として $O(\log n)$
empty 直線が登録されていないか返す $O(1)$