1.二分算法
1.1整数二分
bool check(int x){/* ... */}
int bsearch_1(int l, int r){
while(l < r){
int mid = (l + r) >> 1;
if(check(mid))
r = mid;
else
l = mid + 1;
}
return l;
}
int bsearch_2(int l, int r){
while(l < r){
int mid = (l + r + 1) >> 1;
if(check(mid))
l = mid;
else
r = mid - 1;
}
return l;
}
第一个二分针对的是区间[【l, r】被划分为【l,mid】和【mid + 1, r】时使用,即满足性质的mid在左半边;第二个二分针对的是区间【l,r】被划分为【l, mid - 1】和 【mid, r】时使用,即满足性质的mid在右半边。每次更新mid时,第二种二分方式要加上1;