查找大于等于x的第一个数
ll l = 0, r = n, mid;
while (l < r)
{
mid = (l + r) >> 1;
if (nodes[mid].val >= x)
{
r = mid;
}
else
{
l = mid + 1;
}
}
printf("%lld\n",l);
浮点数情况
double eps=1e-6;
double l,r,mid;
while(r-l>eps)
{
double mid=(l+r)/2;
}
查找小于等于x的最后一个数
ll l = 1, r = n , mid;
while (l < r)
{
mid = (l + r + 1) >> 1;
if (nodes[mid].val <= x)
{
l = mid;
}
else
{
r = mid - 1;
}
}
printf("%lld\n",l);
查找mval等于res,且val小于等于q的最后一个数
ll l = 0, r = n - 1, mid;
while (l < r)
{
mid = (l + r + 1) >> 1;
if (nodes[mid].mval < res)
{
l = mid;
}
else if (nodes[mid].mval > res)
{
r = mid - 1;
}
else if (nodes[mid].val <= q)
{
l = mid;
}
else
{
r = mid - 1;
}
}
printf("%lld\n",l);
二分其他小技巧
1.可二分一定次数后停止
2.最后的结果可遍历一个小的范围取最值
三分
寻找单峰函数的极值
double eps=1e-6;
double l,r,mid;
while(r-l>eps)
{
double m1=l+(r-l)/3.0,m2=r-(r-l)/3.0;
if(f(m1)>f(m2))
{
l=m1;
}
else
{
r=m2;
}
}