/*
* Note:
* 二分法也是分治思想的一种体现
* 分治三步:1.划分问题 2.递归求解 3.合并问题
* 虽然递归能够实现二分,但一般把二分写成非递归形式
* 二分思想很重要
*
* 接下来三个模块求解 1.不重复value 2.重复value求上界 3.重复value求下界
*
*/
#include<bits/stdc++.h>
using namespace std;
int binary_serch(int *A,int x,int y,int v){ // 在区间[x,y)内查找v
int m;
while(x<y){
m=x+(y-x)/2;
if(A[m]==v) return m;
else if(A[m]>v) y=m;
else x=m+1;
}
return -1;
}
// 二分查找求下界 可以处理value值出现多次的情况,返回的是value第一次出现的地方
/*
* 因为是寻找插入v的下界,那么下界待选区间为[x,y]
* A[m]和v的情况如下:
* 1. A[m]=v,m的左侧可能还有v,因此y=m;
* 2. A[m]>v,y=m
* 3. A[m]<v,x=m+1,x肯定不能等于m因为A[m]!=v
* 将1 2整合 A[m]>=v y=m
* return x 即可
*/
int lower_binary_serch(int *A,int x,int y,int v){ // 处理的区间是[x,y)
int m;
while(x<