int bsearch_right(int l, int r)//例如求>=3的最左边的数
{
while (l < r)
{
int mid = l + r >> 1; //向下取整
if (check(mid)) r = mid; // a[mid]满足右半边性质,应在[l, mid]继续寻找
else l = mid + 1;
}
return l;
// 二分结束后,l == r。如果一定存在右半边的边界,l和r都是结果。否则,需要做if判断
}
int bsearch_left(int l, int r)//例如求<=3的最右边的数
{
while (l < r)
{
int mid = l + r + 1 >> 1; // 让下取整变成上取整,避免l = mid出现死循环
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
// 二分结束后,l == r。如果一定存在左半边的边界,l和r都是结果。否则,需要做if判断
}