zoukankan      html  css  js  c++  java
  • lower_bound和upper_bound

    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);

    }

  • 相关阅读:
    命名对象继承2-验证Open*命名对象安全属性的传递
    命名对象继承1-验证Create*命名对象安全属性的传递
    讨论c/c++计算小数的精度问题
    隐藏进程名
    一个函数重载问题
    02-Python基础之列表
    01-Python基础之字符串
    django 实用工具dj-database-url 快速配置数据库
    Gerrit安装配置
    关于数学的摘抄
  • 原文地址:https://www.cnblogs.com/unknownname/p/8823260.html
Copyright © 2011-2022 走看看