1. 二分模板
1.1 标准二分
-
nnn 个单调上升的数 a[i]a[i]a[i] , 查找是否存在 ttt
-
int a[N]; int bin_search(int l, int r, int t){ while(l<=r){ int mid=l+r>>1; if(t==a[mid]) return mid; else if(t<a[mid]) r=mid-1; else l=mid+1; } return -1; }
1.2 找左边界
-
nnn 个单调不降的数 a[i]a[i]a[i] , 查找 ttt 第 111 次出现的位置,没有返回 −1-1−1
-
int a[N]; int bin_search(int l,int r,int t){ while(l<r){ int mid=l+r>>1; if(t<=a[mid]) r=mid; else l=mid+1; } return a[l]==t?l:-1; }
1.3 找右边界
-
nnn 个单调不降的数 a[i]a[i]a[i] , 查找 ttt 最后 111 次出现的位置,没有返回 −1-1−1
-
int a[N]; int bin_search(int l,int r,int t){ while(l<r){ int mid=l+r+1>>1; if(t>=a[mid]) l=mid; else r=mid-1; } return a[r]==t?r:-1; }
1.4 找最接近
-
nnn 个单调不降的数 a[i]a[i]a[i] , 查找和 ttt 最接近的数的值
-
int a[N]; int bin_search(int l,int r,int t){ while(l+1<r){ int mid=l+r>>1; if(t<=a[mid]) r=mid; else l=mid; } return abs(a[l]-t)<=abs(a[r]-t)?a[l]:a[r]; }
1.5 找小于某个数的最大值
-
nnn 个单调不降的数 a[i]a[i]a[i] , 找小于 ttt 的最大值的位置
-
int a[N]; int bin_search(int l,int r,int t){ while(l<r){ int mid=l+r>>1; if(t<=a[mid]) r=mid; else l=mid+1; } return a[l]>=t?l-1:l; }
int k=lower_bound(a+1,a+1+n,t)-a-1;
1.6 找大于某个数的最小值
-
nnn 个单调不降的数 a[i]a[i]a[i] , 找大于 ttt 的最小值的位置
-
int a[N]; int bin_search(int l,int r,int t){ while(l<r){ int mid=l+r+1>>1; if(t>=a[mid]) l=mid; else r=mid-1; } return a[r]>t?r:r+1; }
int k=upper_bound(a+1,a+1+n,t)-a;
1.7 找等于某个数的数数量
-
nnn 个单调不降的数 a[i]a[i]a[i] , 找等于 ttt 的数的数量
-
int num=upper_bound(a+1,a+1+n,t)-lower_bound(a+1,a+1+n,t);