这里可以用到两个stl库中的两个函数,lower_bound() 和 upper_bound().
lower_bound(a+1,a+n+1,x)是求一个序列中第一个大于等于x的数的位置。
upper_bound(a+1,a+n+1,x)是求一个序列中第一个大于x的数的位置。
这里的序列必须是有序序列,所谓有序系列,在STL库中默认有序序列为升序序列,而且一旦对降序序列做upper_bound(),就会发生错误。
那么如果我们想要得到一个有序序列中第一个小于或者小于等于x的数的位置,又该怎么办那?
我们可以把升序序列当做是降序序列,利用lower_bound(a+1,a+n+1,x,cmp)找到这个降序序列中第一个小于x的数的位置。
这里对于这个cmp函数,我们规定bool cmp(int a,int b){return a>b;}
当然C++中有关于大于的函数,可以代替我们上文中提到的cmp函数,lower_bound(a+1,a+n+1,x,greater<int>());
O(nlogn)的时间求最长降序序列
首先,我们需要一个数组s[],实质上充当栈的作用,从头往后遍历数组
a[],遇到小于栈顶元素的数入栈,否则,利用lower_bound(d,d+n,a[i])找到栈中第一个小于a[i]的数,并将这个数踢出栈,让a[i]代替这个数,其实就是一个赋值操作,这样找到的序列一定是最长的降序序列,升序序列与之亦同,自证不再赘述。