ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。
lower_bound和upper_bound如下图所示:
比如给一个数组
a[0] = 1;a[1] = 2;a[2] = 3;a[3] = 5;a[4] = 7;
lower_bound(a,a+5,6)表示从a开始五个位置,查找6,返回的是第一个>=6的数的迭代器指针
即返回的是7的指针,减去a,就得到了a[4]对应的数组下标4
upper_bound(a,a+5,5)表示第一个>5的数的指针,也是4
查找的前提是容器要有序,如果找不到>=或>的,就会返回末尾位置
用法:int low = (lower_bound(a,a+n,a[i]) - a)
a:数组名
(a,a+n):二分查找的范围
a[i]:查找的值
(lower_bound(a,a+n,a[i]) - a):-a取数组中的下标,即相对位置,返回类型为Int
int up = (upper_bound(a,a+n,a[i])-a)
适用范围:
1.查找有序序列中的某个元素的下标(lower_bound找不到返回数组末尾位置)
2.查找某个有序序列中,重复元素的个数(up-low+1)
3.最长上升子序列
int dp[maxn];
void solve()
{
fill(dp,dp+n,INF);
for(int i = 0; i < n; i++)
{
*lower_bound(dp,dp+n,a[i]) = a[i];
}
printf("%d ",lower_bound(dp,dp+n,INF)-dp);
}