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)都是非法解。
什么时候适用二分答案?如果题目规定了有类似“最大值最小”或者“最小值最大”的语句,那么这个东西应该就满足
二分答案的有界性(显然)和单调性(能看出来)。