1 STL(在升序区间[l,r]内查找,查找失败则返回r+1,多开一个空间防止查找失败)

    1.1 lower_bound

        lower_bound(a+l,a+r+1,x)-a
            第一个>=x数的下标
        lower_bound(a+l,a+r+1,x)-1-a
            最后一个<x数的下标

    1.2 upper_bound

        upper_bound(a+l,a+r+1,x)-a
            第一个>x数的下标
        upper_bound(a+l,a+r+1,x)-1-a
            最后一个<=x数的下标

2 整数二分(在升序区间[l,r]内查找,由于第一个mid不会取到r第二个不会取到l,
            所以把区间由[1,n]分别扩展到[1,n+1],[0,n]越界时代表查找失败)

    2.1 第一个>=x数的下标
        while(l<r)
        {
            int mid=(l+r)>>1;
            if(a[mid]>=x)
                r=mid;
            else
                l=mid+1;
        }
        return l;

    2.2 最后一个<=x数的下标
        while(l<r)
        {
            int mid=(l+r+1)>>1;
            if(a[mid]<=x)
                l=mid;
            else
                r=mid-1;
        }
        return l;
3 实数二分

    while(r-l>0...1)
    {
        double mid=(l+r)/2;
        if()
            r=mid;
        else
            l=mid;
    }
    return l;

4   二分答案转化为判定
        在一个区间上,有很多数,这些数可能是我们这些问题的解,换言之,这里有很多不合法的解,也有很多合法的                            
    解。
        我们只考虑合法解,并称之为可行解。考虑所有可行解,我们肯定是要从这些可行解中找到一个最好的作为我们的 
    答案,这个答案我们称之为最优解。
        最优解一定可行,但可行解不一定最优。我们假设整个序列具有单调性,且一个数x为可行解,那么一般的,所有 
    的x'(x'<x)都是可行解。并且,如果有一个数y是非法解,那么一般的,所有的y'(y'>y)都是非法解。
        什么时候适用二分答案?如果题目规定了有类似“最大值最小”或者“最小值最大”的语句,那么这个东西应该就满足 
    二分答案的有界性(显然)和单调性(能看出来)。