二分:

1、常用写法:

c++ : STL

lower_bound(a.begin(), a.end(), x) - a.begin();
对应的是 第一个 >=x 的下标 
upper_bound(a.begin(), a.end(), x) - a.begin();
对应的是 第一个 > x 的下标 

拓展运用: 找第一个小于x的值的下标

int pos = lower_bound(a.begin(), a.end(), x) - a.begin() - 1;
!!!

2、!!!二分答案(二分运用)

特点 :

1、答案在一个区间内, 区间很长, 暴力找会超时

2、答案满足二分性

3、求的答案是最值

4、通常表现为判断一个值是否符合要求很简单

常用写法(我的)

int l = ~, r = ~;
while(l <= r) {
   int mid = l + r >> 1;
   if(check(mid)) l = mid + 1; || r = mid - 1;
   else r = mid - 1; || l = mid + 1;
 }

反正记好了我这种写法, 最后 r 在左边, l 在右边

利用这个性质 + check 函数 推出我们需要的是 r 还是 l

细节!!!!

1、二分答案的最大特征为 : 最小值中最大, 最大值中最小

2、注意边界值, 就是 l 和 r 的最初取值!!!

常常会在这里设坑

3、以后遇到最值问题:

(1)贪心 (2)二分 (3)动态规划