This documentation is automatically generated by online-judge-tools/verification-helper
#include "src/template/binary-search-ld.hpp"
与えられた範囲 l,r と単調性関数 f : p ∣ p ∈ R, l ≤ p ≤ r → false, true について f(p) の値が変化する境界値を発見します。
関数
T zawa::binary_search<T, F, up = 80>(T ok, T ng, const F& f)
T
: l,r の型、double
、long double
などの整数型以外での使用を想定していないF
: std::function<bool(T)>
が入ることになる。 p を引数にとり、false
かtrue
を返す関数。以下の条件を満たす必要がある。
up
: f を呼び出す回数。デフォルトで80回となっている。呼び出すほど精度が上がるが、必要以上に呼び出しても無駄なだけなので注意ok
: f(p) = true となる値なら良いng
: f(p) = false となる値なら良いf
: fup
回呼び出す。#pragma once
#include <cstddef>
namespace zawa {
template <class T, class F, std::size_t up = 80>
T binary_search_ld(T ok, T ng, const F& f) {
for (std::size_t _ = 0 ; _ < up ; _++) {
T mid = (ok + ng) / 2;
if (f(mid)) {
ok = mid;
}
else {
ng = mid;
}
}
return ok;
}
}