二分
第一篇二分搜索论文是 1946 年发表,然而第一个没有 bug 的二分查找法却是在 1962 年才出现,中间用了 16 年的时间。
——不知道哪里看的
整数二分
yxc二分模板
二分的本质是二段性不是单调性。
当想找不满足性质的边界值(红色区域的右边界值)
- 找中间值
mid = (l+r+1)/2
- if(check(mid))等于true或者是false
check(m)是检查m是在不满足性质的区间(检查是不是在红色区间) - 更新l或者r
当想找满足性质的边界值(绿色区域的左边界值)
- 找中间值
mid = (l+r)/2
- if(check(mid))等于true或者是false
check(m)是检查m是在满足性质的区间(检查是不是在绿色区间) - 更新l或者r
归结上面的两种二分方法,步骤为:
- 先写一个check函数
- 判定在check的情况下(true和false的情况下),如何更新区间。
- 在check(m)==true的分支下是:
l=mid
的情况,中间点的更新方式是m=(l+r+1)/2
r=mid
的情况,中间点的更新方式是m=(l+r)/2
这种方法保证了:
- 最后的
l==r
- 搜索到达的答案是闭区间的,即a[l]是满足check()条件的。
模板
//#define judge
#include <bits/stdc++.h>
using namespace std;
typedef long