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