这里安利一下 y总的文章 ,这里呢说说我对它的理解。
里面的模板其实就是求 满足 check() 函数里面的要求 的区间的 左边界,这个弄起来挺头大,大家先背过:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
怎么记呢?很简单啊,可以这样记,虽然道理不是这样的,但这样是可以帮助记忆的:
您看,$l+r$ 并没有加 $1$,肯定没有加 $1$ 的那种大啊,所以一定是左边界啦!
那么怎么记调整边界呢?check
那里我们可以放“严格”一些的条件,这样才可以把区间缩到左边啊~我们每次尽量调整 $r$,但一定不能 $+1$,因为 $mid$ 也是符合条件的;若不行再调整 $l$,但要调 $l$ 的话,此时 check(mid)
是不满足条件的(这样我们才会去调 $l$ 啊),所以 $l = mid$ 还要 $+1$。
模板2:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
可以这样记:
这里加了 $1$,要大一点了,所以以是处理 右边界 的!
check
的条件可以放“宽”一些,这样 $l$ 就可以往右边来,但 不能 $+1$,因为 mid
也是符合条件的。否则,$r$ 移动,但 必须 $-1$,因为 mid
是不符合条件的。
总之,还是要多打,多练。