二分(函数)
lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
lower_bound(dp+1,dp+cnt+1,a[i])-dp;
upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。
二分(手写)
1.first = key
notes : l<=r
4
1 2 3 7
7
这种情况下,在l=r时 才找到 key 值
1 int BinSearch(int l,int r,int key){ 2 int n=r+1; 3 while(l<=r){ 4 int mid=(r-l>>1)+l; 5 if(a[mid]>=key){ 6 r=mid-1; 7 }else{ 8 l=mid+1; 9 } 10 } 11 if(l<n&&a[l]==key) 12 return l+1; 13 return -1; 14 }
2.end = key
1 int BinSearch(int l,int r,int key){ 2 while(l<=r){ 3 int mid=(r-l>>1)+l; 4 if(a[mid]>key){ 5 r=mid-1; 6 }else{ 7 l=mid+1; 8 } 9 } 10 if(r>-1&&a[r]==key) 11 return r+1; 12 return -1; 13 }
3.end < key
1 int BinSearch(int l,int r,int key){ 2 while(l<=r){ 3 int mid=(r-l>>1)+l; 4 if(a[mid]<key){ 5 l=mid+1; 6 }else{ 7 r=mid-1; 8 } 9 } 10 return r+1; 11 12 }
4.end = or < key
1 int BinSearch(int l,int r,int key){ 2 while(l<=r){ 3 4 int mid=(r-l>>1)+l; 5 if(a[mid]>key){ 6 r=mid-1; 7 }else{ 8 l=mid+1; 9 } 10 } 11 return r+1; 12 }
5.first = or > key
1 int BinSearch(int l,int r,int key){ 2 while(l<=r){ 3 4 int mid=(r-l>>1)+l; 5 if(a[mid]>=key){ 6 r=mid-1; 7 }else{ 8 l=mid+1; 9 } 10 } 11 return l+1; 12 }
6.first > key
1 int BinSearch(int l,int r,int key){ 2 while(l<=r){ 3 4 int mid=(r-l>>1)+l; 5 if(a[mid]>key){ 6 r=mid-1; 7 }else{ 8 l=mid+1; 9 } 10 } 11 return l+1; 12 }