首先要#include<algorithm>
int a[];
upper_bound(a+i,a+j,x)-a返回的是第一个大于x的数的坐标
upper_bound(a.begin(),a.end(),x)返回的是迭代器
low_bound(first,last,x)返回的是第一个大于等于x的数的指针或者迭代器
两者查找的范围都是[first,last)
要求数组或者vector事先是有序的
时间复杂度是O(log(last-first))
如果要自己写这连个函数,可以参考以下的代码:
int upper_bound(int l,int r,int x)
{ while(l<r){
int mid=(l+r)/2;
if(a[mid]>x)r=mid;
else l=mid+1;
}
return l;
}
int lower_bound(int l,int r,int x)
{ while(l<r){
int mid=(l+r)/2;
if(a[mid]>=x)r=mid;
else l=mid+1;
}
return l;
}
对比二分查找
int binarysearch(int l,int r,int x)
{ while(l<=r){
int mid=(l+r)/2;
if(a[mid]==x)return mid;
else if(a[mid]>x)r=mid-1;
else l=mid+1;
}
return -1;
}
对比于开方
double sqrt(double x)
{ double l=1,r=x,mid;
while(r-l>eps){
mid=(l+r)/2;
if(mid*mid>x)r=mid;
else l=mid;
}
return mid;
}