写在最前面:

此系列中的所有模板全为大佬所写,我只是一个搬运工(?)。

记录:

最开始的时候我以为二分就是单纯的二分(懂得都懂),后来发现是我想太多-_-。

好了,言归正传。

二分,顾名思义,就是把一个区间分为两段,把需要的一段留下,不需要的一段舍去,然后递归求解,直到区间小到只容得下一个数即可(浮点数二分可以让区间的差小于1e-6或者更小)。二分一定会有一个解,最后的解是l=r时候的结果。

二分大概有两种情况,一种是所取区间在前半,而且中间值可取;另一种是所在区间在后半,且中间值可取。第二种情况在去中间值的时候需要注意,在取mid的时候应该在l+r之后+1,否则将会造成死循环。

举个例子:

在1,2中二分求2,如果选择不进行+1,那么在计算过程中mid=1,(mid向下取整),check为mid<2,判断成立,所以l=1,和之前相同,所以陷入了死循环。

关于check函数:

看题目要求,如果短点的话直接在if条件里面概括就行。我个人认为写int函数和bool函数(ture/false)最后的结果应该是差不多的。不过bool还是用的比较多的。

下面是模板:

#include <iostream>

using namespace std;
int check(int mid)//此处为随便定义
{
    if(mid>0)
        return 1;
    else return 0;
}
int bsearch1(int l,int r)//调整边界二分搜索
{
    while (l<r)
    {
        int mid=(l+r)>>1;
        if(check(mid))//check根据题意来定
            r=mid;//mid可能取到右边界,要哪边哪边在true里面,另外一边改动
        else l=mid+1;
    }
    return l;
}
int bsearch2(int l,int r)
{
    while (l<r)
    {
        int mid=(l+r+1)>>1;
        if(check(mid))
            l=mid;//mid可能取到左边界
        else r=mid-1;
    }
    return l;
}