This documentation is automatically generated by online-judge-tools/verification-helper
#include "src/template/binary-search.hpp"
与えられた範囲 $l, r$ と単調性関数 $f\ :\ {\ p\ \mid\ p\ \in\ \mathbb{Z},\ l\ \le\ p\ \le\ r\ } \rightarrow\ {\ \text{false},\ \text{true}\ }$ について $f(p)$ の値が変化する境界値を発見します。
関数
T zawa::binary_search<T, F>(T ok, T ng, const F& f)
T
: $l, r$ の型、int
long
long long
などの整数型以外での使用を想定していないF
: std::function<bool(T)>
が入ることになる。 $p$ を引数にとり、false
かtrue
を返す関数。以下の条件を満たす必要がある。
ok
: $f(p)\ =\ \text{true}$ となる値なら良いng
: $f(p)\ =\ \text{false}$ となる値なら良いf
: $f$#pragma once
#include <cmath>
namespace zawa {
template <class T, class F>
T binary_search(T ok, T ng, const F& f) {
while (std::abs(ok - ng) > 1) {
T mid = ((ok + ng) >> 1);
if (f(mid)) {
ok = mid;
}
else {
ng = mid;
}
}
return ok;
}
}
#line 2 "src/template/binary-search.hpp"
#include <cmath>
namespace zawa {
template <class T, class F>
T binary_search(T ok, T ng, const F& f) {
while (std::abs(ok - ng) > 1) {
T mid = ((ok + ng) >> 1);
if (f(mid)) {
ok = mid;
}
else {
ng = mid;
}
}
return ok;
}
}