1.本质:满足某种性质,使得整个区间一分为二
2.两种情况
(1)目的:二分红色区间右端点
check (mid)是否满足红色区间性质
此处注意mid=(l+r+1)/2:如果l=r-1且check mid 为true,l=mid=l (下取整) 相当于没有更新
(2)目的:二分绿色区间左端点
check (mid)是否满足绿色区间的性质
3.步骤:
(1)求mid
(2)check mid
4.例题:acwing728----数的范围
#include<iostream>
using namespace std;
const int N = 100010;
int n, m;
int q[N];
int main()
{
scanf_s("%d%d", &n, &m);
for (int i = 0; i < n; i++)scanf_s("%d", &q[i]);
while (m--)
{
int x;
scanf_s("%d", &x);
int l = 0, r = n - 1;
while (l < r)
{
int mid = l + r >> 1;
if (q[mid] >= x)r = mid;
else l = mid + 1;
}
if (q[l] != x)cout << "- 1 - 1" << endl;//如果无解,则会返回第一个大于等于x的数
else
{
cout << l << ' ';
int l = 0, r = n - 1;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (q[mid] <= x)l = mid;
else r = mid - 1;
}
cout << l << endl;
}
}
return 0;
}