二分答案
1 int l=0,r=1e9; 2 while (l<=r){ 3 int mid=l+r>>1; 4 if (check(mid)) l=mid+1,ans=mid; 5 else r=mid-1; 6 }
查找=x的第一个数的下标
1 int look(int l,int x){ 2 int ans=0,r=n; 3 while(l<=r){ 4 int mid=l+r>>1; 5 if(a[mid]<x) l=mid+1; 6 else ans=mid,r=mid-1; 7 } 8 return ans; 9 }
查找=x的最后一个数的下标
1 int look(int l,int x){ 2 int ans=0,r=n; 3 while(l<=r){ 4 int mid=l+r>>1; 5 if(a[mid]<=x) ans=mid,l=mid+1; 6 else r=mid-1; 7 } 8 return ans; 9 }
查找小于x的最后一个数的下标
1 int look(int l,int x){ 2 int ans=0,r=n; 3 while(l<=r){ 4 int mid=l+r>>1; 5 if(a[mid]<x) ans=mid,l=mid+1; 6 else r=mid-1; 7 } 8 return ans; 9 }
查找大于x的最先一个数的下标
1 int look(int l,int x){ 2 int ans=0,r=n; 3 while(l<=r){ 4 int mid=l+r>>1; 5 if(a[mid]>x) ans=mid,r=mid-1; 6 else l=mid+1; 7 } 8 return ans; 9 }
查找大于等于x的最先一个数的下标
1 int look(int l,int x){ 2 int ans=0,r=n; 3 while(l<=r){ 4 int mid=l+r>>1; 5 if(a[mid]>=x) ans=mid,r=mid-1; 6 else l=mid+1; 7 } 8 return ans; 9 }
查找小于等于x的最后一个数的下标
1 int look(int l,int x){ 2 int ans=0,r=n; 3 while(l<=r){ 4 int mid=l+r>>1; 5 if(a[mid]<=x) ans=mid,l=mid+1; 6 else r=mid-1; 7 } 8 return ans; 9 }