STL函数 lower_bound 和 upper_bound 在算法竞赛中的用法
以前比较排斥这两个函数,遇到需要二分的情景都是手写 \(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 在算法竞赛中的用法的更多相关文章
- 二分检索函数lower_bound()和upper_bound()
二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...
- 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)
算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...
- Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例
摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...
- 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)
算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...
- 算法竞赛中的常用JAVA API :HashMap 和 TreeMap(转载)
算法竞赛中的常用JAVA API :HashMap 和 TreeMap 摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实 ...
- 8.算法竞赛中的常用JAVA API :Calendar日期类
8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...
- 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)
7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...
- 6.算法竞赛中的常用JAVA API :Math类(转载)
6.算法竞赛中的常用JAVA API :Math类 求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double ...
- 算法竞赛中的常用JAVA API :大数类(转载)
5.算法竞赛中的常用JAVA API :大数类 摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1 对应的十进制数是9223372036854775807(long类型的最大 ...
随机推荐
- ELF文件之四——使用链接脚本-2个函数-data
main.c ; int main() { ; } int add() { ; } main.o 反汇编可以看到多了.text节的反汇编,存储的是全局变量的初始化数值 main.o对比,text段后面 ...
- 大延时情况tcp和udp测试
环境搭建 使能Ubuntu的IPv6转发功能 root@yanhc-Aspire-4738G:/home/yanhc# cat /proc/sys/net/ipv4/ip_forward root@y ...
- Windows环境下Nginx配置本地虚拟域名
进入conf文件夹,新建servers文件夹: 将内部的server配置段提取单独放在一个文件里,存到了conf/servers下,以方便配置多个虚拟主机. 并在nginx.conf里http配置段内 ...
- rfc文档
你会看到很多网上关于标准的rfc文档. 如何阅读rfc 文档. https://juejin.im/post/5bf1948ff265da61553a6c97 从一个普通的RFC文档上升到Intern ...
- docker容器互联,实现目录、服务共享
一.需求 docker使服务之间实现容器隔离,比如Javaweb项目前端.后端.数据库.数据库后台,分别把它们部署在不同的容器里面,实现隔离.但服务和服务之间也有互访的需求,这就涉及到容器网络和容器互 ...
- eslint报"Extra semicolon"错误的解决
手机赚钱怎么赚,给大家推荐一个手机赚钱APP汇总平台:手指乐(http://www.szhile.com/),辛苦搬砖之余用闲余时间动动手指,就可以日赚数百元 使用 vue-cli 构建的项目,模版是 ...
- JVM类加载器是否可以加载自定义的String
前言 曾经有一次,面试官问到类加载机制,相信大多数小伙伴都可以答上来双亲委派机制,也都知道JVM出于安全性的考虑,全限定类名相同的String是不能被加载的.但是如果加载了,会出现什么样的结果呢?异常 ...
- codewars--js--Reverse or rotate?----es6变量,箭头函数,正则取块
问题描述: 对输入的str按照sz个数进行分块,若一块内所有数字的立方和是偶数,则倒序:否则,向左移动一位.然后将修改过的块整合到一个字符串,作为输出. The input is a string s ...
- for遍历用例数据时,报错:TypeError: list indices must be integers, not dict,'int' object is not iterable解决方法
一:报错:TypeError: list indices must be integers, not dict for i in range(0,len(test_data)): suite.addT ...
- RxJava的concat操作符
更多文章请点击:http://77blogs.com/?p=170 转载请标明出处:https://www.cnblogs.com/tangZH/p/12088332.html,http://77bl ...