以前比较排斥这两个函数,遇到需要二分的情景都是手写 \(while(left<=right)\)。

这次决定洗心革面记录一下这两个函数的在算法竞赛中的用法,毕竟一般不会导致TLE。

其实百度百科已经概述得比较清楚了,

我们假设 \(value\) 为一个给定的数值,

\(lower\_bound\) 是在一个升序序列中从前后后找第一个大于等于 \(value\) 的值,

\(upper\_bound\) 是在一个升序序列中从前后后找第一个大于 \(value\) 的值。

比如:\(lower\_bound(a+1,a+n+1,k)\) 就是在\(a\)数组的\([1,n]\)范围(必须升序)里从前到后找第一个大于等于\(k\)的值,并以指针的形式返回。

注意,这两个函数的返回值都是一个指针,指向原序列中可以插入value,而不会破坏容器顺序的第一个位置。

我们可以在指针函数前面加个取值符 * ,来获得想得到的值。

看到这里,你应该知道lower和upper这两个单词的含义的吧,即将value插入某位置后该序列仍然分别是单调不严格递增单调严格递增的。

举个栗子:

	int *p1,*p2;
int a[6]={3,5,6,6,7,9};
p1=lower_bound(a,a+6,6);
p2=upper_bound(a,a+6,6);
printf("内存地址: p1 -> %d p2 -> %d\n",p1,p2);
printf("在原序列中找到的值: p1 = %d p2 = %d\n",*p1,*p2);

运行结果为:

内存地址: p1 -> 7339512 p2 -> 7339520
在原序列中找到的值: p1 = 6 p2 = 7

如果我们不想使用指针操作也可以,可以这样写: \(lower\_bound(a+1,a+n+1,k) - a\)

意思是把找出的指针地址减去a数组的起始内存地址(数组的内存是连续的),获得该值的位置在a数组中的下标。

	int p1,p2;
int a[6]={3,5,6,6,7,9};
p1=lower_bound(a,a+6,6)-a;
p2=upper_bound(a,a+6,6)-a;
printf("找出的值的下标: p1 = %d p2 = %d\n",p1,p2);
printf("找出的值: a[%d] = %d a[%d] = %d\n",p1,a[p1],p2,a[p2]);

运行结果为:

找出的值的下标: p1 = 2 p2 = 4
找出的值: a[2] = 6 a[4] = 7



那如果我们想在一个单调递减的序列中找第一个小于等于或小于某个值的数呢?

只需要把修改后的cmp传入\(lower\_bound\)或\(upper\_bound\)函数内,将数组内元素的比较方式修改即可。

Usage:

bool cmp(const int &a,const int &b) { return a > b; }
int *p1=lower_bound(a+1,a+n+1,k,cmp);
int *p2=upper_bound(a+1,a+n+1,k,cmp);

其中\(a\)数组也可以为结构体数组,如果内嵌了重载函数可以不写cmp。

也就是说,只要让系统知道了这个数组元素的比较方式,在这种比较方式下数组在给定范围是\(有序\)的,即可使用这两个函数。

如果是\(a\)数组是整形变量,可以使用C++原生的比较函数(从大到小)。

\(lower\_bound(a+1,a+n+1,value,greater<int>())\)

STL函数 lower_bound 和 upper_bound 在算法竞赛中的用法的更多相关文章

  1. 二分检索函数lower_bound()和upper_bound()

    二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...

  2. 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)

    算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...

  3. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

  4. 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)

    算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...

  5. 算法竞赛中的常用JAVA API :HashMap 和 TreeMap(转载)

    算法竞赛中的常用JAVA API :HashMap 和 TreeMap 摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实 ...

  6. 8.算法竞赛中的常用JAVA API :Calendar日期类

    8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...

  7. 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)

    7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...

  8. 6.算法竞赛中的常用JAVA API :Math类(转载)

    6.算法竞赛中的常用JAVA API :Math类 求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double ...

  9. 算法竞赛中的常用JAVA API :大数类(转载)

    5.算法竞赛中的常用JAVA API :大数类 摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1 对应的十进制数是9223372036854775807(long类型的最大 ...

随机推荐

  1. STM32F4相关

    常用术语 AHB与APB的地位相当于PC中的南北桥,是两道独立的片内总线.AHB:advanced high-performance bus:APB: advanced peripherals bus

  2. 持续化运维 DevOps

            DevOps(Development和Operations的组合词)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整 ...

  3. 2014.1.21 DNS大事故(dns原理、网络封锁原理)

    1.21那天发生了什么,由1.21联想补充……  很多网站都上不去,域名解析都到了65.49.2.178这个IP地址 先科普,再深挖  dns查询类型 递归查询,迭代查询   DNS解析过程,这里使用 ...

  4. 安利自己写的easy-clipboard库

    概述 clipboard.js 是一个非常好用的剪切板插件,但是随着前端框架的演变,用户与网页交互的方式越来越多,不仅限于点击事件了,并且在很多情况下,我们可能不需要它强制性自带的点击事件,所以我打算 ...

  5. 杭电------2097 Sky数(C语言写)

    //这个题没有一次过,哈哈哈哈,题意理解错了,开始还以为是必须加起来等于22呢 //其实就是依次算出个进制下的和,虽然每个循环最多循环四次,但是还是加上必要的判断,想办法让 //提前结束 #inclu ...

  6. centos系统重装python或yum 报There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:错误

    sudo vim /usr/bin/yum #修个python所在的路径,例如 #/usr/local/bin/python2.6 或 /usr/local/bin/python2.7要原本你的系统原 ...

  7. vertical-align和line-height的理解及实例

    line-height 字符实际大小和font-size的关系: 下图中不同字体font-size都是100px 测量了一下每个 span 的高度:Helvetica 115px,Gruppo 97p ...

  8. python网络爬虫(二)requests库的基本介绍和使用

    一.requests库的七个重要方法 (1)最常用方法:requests.get(url,params=None,**kwargs)//对应HTTP协议的GET()操作 (请求获得URL位置的资源) ...

  9. IIS网站部署配置

    1.配置Session State

  10. O2O外卖玩众包 开放平台难解标准之痛

    开放平台难解标准之痛" title="O2O外卖玩众包 开放平台难解标准之痛">  有一种怪现象一直是国内互联网企业摆脱不了的附骨之疽--不管规模大小,总是削尖了脑 ...