众所周知,二分是一种简单实用的搜索方法,用于搜索一个有序数列中大于(等于)或小于(等于)某个值的第一个元素的位置。
思路就是每一次都找出左边界l和有边界r的中点mid,然后根据题目的要求判断条件,把mid更新为l或r,一直这样直到l >= r时,返回r或l。
然后。。。直接看看模板吧,嘿嘿。
1.整形二分
整形二分比较诡异。。。主要是设计到边界问题,容易出现问题。
不过我们可以概括分为两种情况,然后用上相应的模板,就不会出现边界问题啦啦啦~~
<1>判断条件成立时让r = mid的情况
const int N = 10010;
int a[N];
int bserch(int x, int l, int r)
{
while(l < r)
{
int mid = r + l >> 1;
if(a[mid] >= x) r = mid;
else l = mid;
}
return l;
}
<2>判断条件成立时让l = mid的情况
const int N = 10010;
int a[N];
int bserch(int x, int l, int r)
{
while(l < r)
{
int mid = r + l + 1 >> 1;
if(a[mid] <= x) l = mid;
else r = mid;
}
return r;
}
其实也很容易看出来,两个板子基本只有mid = l + r >> 1和mid = l + r + 1 >> 1的区别,所以很容易就可以记住了。
2.实型二分
实型二分就简单很多了,少了奇奇怪怪的边界问题,直接用思想转换成板子就好了。
const int N = 10010;
double bserch(double x, double l, double r)
{
while(l < r)
{
double mid = (r + l) / 2;
if(mid >= x) r = mid;
else l = mid;
}
return l;
}
然后。。。。完了。。没有了。。。就是这样。。。感觉好短呀QwQ
算了算了,不管了,睡了zzz