zoukankan      html  css  js  c++  java
  • 手写vector 的lower_bound和upper_bound

    需要注意的是返还值是其在vector中的下标而不是第几个,如果vector中的元素均小于它则需特判这种情况返还+1;

    lower找第一个大于等于它的位置,而upper找第一个大于它的。

    用upper(r)-lower(l)可得区间个数,因为Upp把个数放大了一就相当与r-l+1里面的加1,而如果有等于的就少减一个算上这个等于的贡献反之选后边的所以特判if  >=  return mid+1;

    这两个特判用来考虑mid是否==end()的情况,如果不是直接return我们找到的值

    (个人理解,如果不对,请谅解)

    inline int lower_bound(int x,int y)
    {
        l=0,r=mark[x].size()-1;
        while(l<=r)
        {
            mid=(l+r)>>1;
            if(mark[x][mid]==y) return mid;
            else if(mark[x][mid]>y)  r=mid-1;
            else l=mid+1;
        }
        if(y>mark[x][mid])  return mid+1;
        return mid;
    }
    inline int upper_bound(int x,int y)
    {
        l=0,r=mark[x].size()-1;
        while(l<=r)
        {
            mid=(l+r)>>1;
            if(mark[x][mid]>y)  r=mid-1;
            else l=mid+1;
        }
        if(y>=mark[x][mid])  return mid+1;
        return mid;
    }

  • 相关阅读:
    C#:BackgroundWorker的简单使用
    C#:DataTable 操作
    树和二叉树
    Git下的标签
    python的高级应用
    字符串匹配的BF算法和KMP算法学习
    GitHub:多人协作下的分支处理
    Git:分支的创建、合并、管理和删除
    GitHub:创建和修改远程仓库
    Git:文件操作和历史回退
  • 原文地址:https://www.cnblogs.com/three-D/p/11295068.html
Copyright © 2011-2022 走看看