近段时间过于依赖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 源代码 

https://blog.csdn.net/qq_30241305/article/details/51721696