K 番目の要素 (non explicit)
explicit ではない集合 $X$ の,小さい方から $K$ 番目の要素を,二分探索で求める. ただし,$1 \leq K \leq |X|$ とする.
$K$ 番目の要素は, 「$X_i \leq t$ となる $i$ が $K$ 個以上となる最小の $t$」であるから, $\text{binsearch}(\lambda t.\; | \{i : X_i \leq t \} | \geq K, \max(X), \min(X) - 1)$ で求められる.
auto check = [&](ll t) -> bool {
return "the number of i such that X[i] >= t";
};
ll ans = binsearch_i<ll>(check, "max of X", "min of X" - 1);
言い換えると, 「$X_i < t$ となる $i$ が $K$ 個未満となる最大の $t$」でもあるから, $\text{binsearch}(\lambda t.\; | \{i : X_i < t \} | < K, \min(X), \max(X) + 1)$ でも求められる.
auto check = [&](ll t) -> bool {
return "the number of i such that X[i] < t";
};
ll ans = binsearch_i<ll>(check, "min of X", "max of X" + 1);
ベクトル v の t 付近の要素
$v$ の要素は整数型とする.
基本は次のこと:
$v_i < t$ となる $i$ の個数は,
lower_bound(ALL(v), t) - v.begin()
である.
$v_i \leq t$ については,$v_i < t + 1$ と言い換えれば良いし, $v_i > t$ や $v_i \geq t$ については,$|v|$ から引けば良い.
また,添字の値については次の通り.
- $v_i < t$ となる最大の $i$ の値は,(上の個数 - 1) である. 存在しない場合には当然 -1 になる.
- $v_i \leq t$ となる最大の $i$ の値も同様.
- $v_i > t$ となる最小の $i$ の値は,もちろん,
upper_bound(ALL(v)) - v.begin()
である. - $v_i \geq t$ となる最小の $i$ の値は,もちろん,
lower_bound(ALL(v)) - v.begin()
である.
keywords: k-th element, binary search, lower_bound, upper_bound