Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
binary_search.hpp
[詳解]
1#pragma once
2#include"../../kyopro_library/template.hpp"
3
4/// @brief 二分探索
5/// @details 条件 judge を満たす ok と ng の境界を二分探索によって求める。
6/// @note O(log(|ok - ng|) * f)
7template<typename T, typename Judge>
8T BinarySearch(T ok, T ng, Judge judge) {
9 while(abs(ok-ng)>1) {
10 T mid=(ok+ng)/2;
11 if(judge(mid)) ok=mid;
12 else ng=mid;
13 }
14 return ok;
15}
16
17/// @brief 回数指定二分探索
18/// @details 条件 judge を満たす ok と ng の境界を二分探索によって求める。
19/// @note O(iter * f)
20template<typename T, typename Judge>
21T BinarySearchIteration(T ok, T ng, Judge judge, int iter=100) {
22 while(iter--) {
23 T mid=(ok+ng)/2;
24 if(judge(mid)) ok=mid;
25 else ng=mid;
26 }
27 return ok;
28}
29
30/// @brief 単調性の確認
31/// @details 関数 judge が単調性を満たすか否かを確認する
32/// @param start 開始要素
33/// @param step 探索幅
34/// @param iter 探索回数
35template<typename T, typename Judge>
36bool CheckMonotonicity(T start, T step, ll iter, Judge judge) {
37 cerr<<"[ ";
38 bool pre=false;
39 ll cnt=0;
40 for(T i=start; iter>0; iter--, i+=step) {
41 bool tmp=judge(i);
42 cerr<<"{ "<<i<<" : "<<(tmp ? "OK" : "NG")<<" }, ";
43 if(i!=start&&tmp!=pre) cnt++;
44 pre=tmp;
45 }
46 cerr<<" ]\n";
47
48 if(cnt<=1) cerr<<"Is Monotonic\n";
49 else cerr<<"Not Monotonicss\n";
50 return cnt<=1;
51}
T BinarySearchIteration(T ok, T ng, Judge judge, int iter=100)
回数指定二分探索
T BinarySearch(T ok, T ng, Judge judge)
二分探索
bool CheckMonotonicity(T start, T step, ll iter, Judge judge)
単調性の確認