重启——二分
整数二分
while (m -- )
{
int x;
scanf("%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;
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;
}
}
浮点数二分
while(r-l>1e-6) //-几比结果需要的精度多两位,如保留4位,则r-l>1e-6
{
double mid = l+r >>1;
if(mid*mid>=x) r=mid;
else l = mid;
}
原理:区间长度极小时可视为一个数字