(挑战程序设计P66)
lower_bound这个STL函数,从已安排好的序列a中利用二分搜索找出指向满足ai >= k的ai的最小指针。类似的函数还有upper_bound,这一函数求出的是指向满足ai > k的ai的最小指针。
如下图所示:
用这两个函数可以很快的求出长度为n的有序数组a中k的个数:
num = upper_bound(a, a+n, k) - lower_bound(a, a+h, k);
在求最长上升子序列问题中,用lower_bound会使代码更高效:
int dp[N];
void solve()
{
fill(dp, dp+n, INF);
for(int i = 0; i < n; i++)
*lower_bound(dp, dp+n, a[i]) = a[i];//在dp中找到大于等于a[i]的最小指针,也就是找到第一个a[i]
printf("%d\n", lower_bound(dp, dp+n, INF) - dp);//找到第一个INF的指针,减去头地址就是上升序列的长度
}