以前比较排斥这两个函数,遇到需要二分的情景都是手写 \(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. 全网一定不是最好懂的C++线性筛素数

    Part 0:概念 先给几个概念(很重要): 合数:如果\(xy=z\text{且}x,y\text{为正整数}\),我们就说\(x,y\text{是}z\text{的合数}\) 素数:如果数\(a\ ...

  2. 【TensorFlow】TensorFlow基础 —— 模型的保存读取与可视化方法总结

    TensorFlow提供了一个用于保存模型的工具以及一个可视化方案 这里使用的TensorFlow为1.3.0版本 一.保存模型数据 模型数据以文件的形式保存到本地: 使用神经网络模型进行大数据量和复 ...

  3. 《Head First Java(第二版)》中文版 分享下载

    书籍信息 书名:<Head First Java(第二版)>中文版 作者: Kathy Sierra,Bert Bates 著 / 杨尊一 编译 张然等 改编 豆瓣评分:8.7分 内容简介 ...

  4. 数据算法 --hadoop/spark数据处理技巧 --(9.基于内容的电影推荐 10. 使用马尔科夫模型的智能邮件营销)

    九.基于内容的电影推荐 在基于内容的推荐系统中,我们得到的关于内容的信息越多,算法就会越复杂(设计的变量更多),不过推荐也会更准确,更合理. 本次基于评分,提供一个3阶段的MR解决方案来实现电影推荐. ...

  5. ibtmp1文件过大

    有个数据库发现磁盘告警 已经100% 经过排查发现数据库的data目录下有个 ibtmp1是个什么东西呢?查看官方文档后发现 The temporary tablespace is a tablesp ...

  6. vi/vim编辑器操作梳理

    1. vi/vim编辑器详细使用讲解 1.1 vi/vim编辑器的3种模式 1.2 vi/vim编辑器操作说明 参数/命令/模式 说明 ###普通模式   :set nu  显示行号 :set non ...

  7. Apache 的多站点配置

    1.修改httpd.conf 文件 Apache的主配置文件路径: D:\phpTools\Apache24\conf 用编辑器打开 httpd.conf 文件,查找 #Include conf/ex ...

  8. ab使用详解—如何使用apache性能测试工具进行压力测试

    作为后端工程师,除了实现业务需求之外,需要考虑的就是自己写的服务,在大并发下是否能正常运行了.但是,在一般开发情况下,没那么多大并发情况让你测试,那该怎么办呢? 这时候,我们就可以用到apache的压 ...

  9. 使用 Apache James 3.3.0(开源免费) 搭建内网电子邮件服务器(基于 Windows + Amazon Corretto 8)

    电子邮件服务器,对于很多公司,都是需要的. 虽然现在很多人,使用 QQ .微信进行一对一的工作沟通,使用QQ 群.微信群进行多人沟通,但这些即时聊天工具,与电子邮件相比,仍有很多不足: a. 电子邮件 ...

  10. 10.Android-SharedPreferences使用

    1.SharedPreferences介绍 SharedPreferences,它是一个轻量级的配置文件类,用于保存软件配置参数. 采用xml文件形式存储在/data/data/包名/shared_p ...