时间复杂度:。
在左闭右开 区间[l, r)内查找v.
否则返回-1
int bsearch(int *a, int l, int r, int v) {
while(l < r) {
int m = l + (r - l) / 2 //这种写法可以防止溢出
if(a[m] == v) return v;
else if(a[m] > v) r = m; // 左闭右开
else l = m + 1;
}
return -1;
}
查找下界。(第一个等于v的元素的下标)
否则返回插入该元素的位置。
int lower_bound(int *a, int l, int r, int v) {
while(l < r) {
int m = l + (r - l) / 2;
if(a[m] >= v) r = m;
else l = m + 1;
}
return l;
}
查找上界(第一个大于v的元素的下标)
否则返回插入该元素的位置。
int upper_bound(int *a, int l, int r, int v) {
while(l < r) {
int m = l + (r - l) / 2;
if(a[m] <= v) l = m + 1;
else r = m;
}
return l;
}