This documentation is automatically generated by online-judge-tools/verification-helper
#include "src/template/binary-search-ld.hpp"
与えられた範囲 $l, r$ と単調性関数 $f\ :\ {\ p\ \mid\ p\ \in\ \mathbb{R},\ l\ \le\ p\ \le\ r\ } \rightarrow\ {\ \text{false},\ \text{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)\ =\ \text{true}$ となる値なら良いng
: $f(p)\ =\ \text{false}$ となる値なら良いf
: $f$up
回呼び出す。#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;
}
}
#line 2 "src/template/binary-search-ld.hpp"
#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;
}
}