近段时间过于依赖lower_bound
以至于在比赛时代码出现了很多问题
回顾一下二分查找
相当于upper_bound 返回的是大于x的第一个值的位置
int bis(int x)
{
int l=x,r=n,mid=(l+r)/2;
while(l<=r)
{
mid=(l+r)/2;
if(mid<=x) l=mid+1;
else r=mid-1;
}
return l;
}
而lower_bound 如下 返回的是大于或等于该元素的第一个值
int bis(int x)
{
int l=x,r=n,mid=(l+r)/2;
while(l<=r)
{
mid=(l+r)/2;
if(mid<x) l=mid+1;
else r=mid-1;
}
return l;
}
两个代码只在判断中差了一个取等
而在二分答案中经常需要返回的是满足条件的最大值 此时通常应该返回r 具体的返回值要结合实际进行分析
附上lower_bound 源代码