#include<iostream>
using namespace std;
//对于一个从小到大有序的数组而言,左边的值是小于等于右边的;同理,右边的值是大于等于左边的
int main(){
int n, q; cin >> n >> q;
int a[n + 5];
for(int i = 0; i < n; i ++) scanf("%d", &a[i]);
while(q --){
int k; scanf("%d", &k);
int l = 0, r = n - 1;
//如何找到左端点L?
// -> L的位置是k出现的第一个位置即可 -> [0, L-1]区间的元素全部小于k
//如何让[0, L-1]区间的元素全部都小于k?
// -> 通过中间位置的值来判断 -> 如果a[mid] < k, 此时的mid一定是位于最终L位置的左边 -> 只需让l进行移动, l = mid + 1
// -> 如果存在K,最终l一定会移动到L的位置
//the while floop below can find the first site of K
while(l < r){
int mid = (l + r) >> 1;
if(a[mid] >= k) // mid在k的右边 -> 要往左找 -> 将右边的区间舍去
// mid及其左边包含值为k的元素 -> k 属于[l, mid] 区间 -> r = mid
//为什么不能说mid+1及其右边不包含值为k的元素, 因为a[mid+1]可能等于k,但是要找左端点所以被舍去了,后面的都同理
r = mid;
else // a[mid] < k -> mid在k的左边 -> 要往右找 -> 将左边的区间舍去
// mid + 1及其右边包含值为k的元素 -> k属于[mid + 1, r] -> l = mid + 1;
l = mid + 1;
}
if(a[l] != k) { //左边边界没有找到 -> 不存在这个元素 -> 可以直接continue了
printf("-1 -1\n");
continue;
}
printf("%d ", l);
l = 0, r = n - 1;
//如何找到右端点R?
// -> R的位置是k出现的最后一个位置即可 -> [R+1, n-1]区间的元素全部大于k
//如何找到[R+1, n-1]区间?
// -> 同样通过中间位置的值来判断 -> 如果a[mid] > k, 此时的mid一定是位于最终R位置的右边 -> 只需让r进行移动,r = mid - 1
// ->存在k,最终r一定会移动到R的位置
while(l < r){
int mid = (l + r + 1) >> 1;
if(a[mid] <= k) //mid在k的左边 -> 往右找 ->将左边的区间舍去
//mid及其右边包含值为k的元素 ->k属于[mid, r]区间 -> l = mid
l = mid;
else//a[mid]>k -> mid在k的右边 ->往左找 -> 将右边的区间舍去
//mid - 1及其左边包含值为k的元素 -> k属于[l, mid - 1]区间 -> r = mid - 1
r = mid - 1;
}
printf("%d\n", r);
}
return 0;
}
//不明白为什么要让a[mid] < k or a[mid] > k?
//那么我们假设a数组中存在多个k值,并且最左端是a[L],最右端是a[R]
//现在我们需要找到最左端的位置,也就是说,a{L-1]要小于k,假设mid = L-1,那么可以推理出a[mid] < k
//同理,a[R + 1] > k, 假设mid = R + 1, a[mid] > k
相关推荐
第18届全国大学生智能汽车竞赛四轮车开源讲解【2.5】-- 图像处理实战:从二值化到边缘检测的工程优化
本文深入讲解了第18届全国大学生智能汽车竞赛四轮车开源项目中图像处理的核心实战技术。文章聚焦于二值化与边缘检测两大关键环节,详细对比了大津法与索贝尔算子的工程应用与优化策略,并分享了遮光、偏振片等物理抗干扰技巧,旨在帮助参赛者构建稳定高效的图像预处理流水线,为赛道识别奠定坚实基础。
二分查找(整数)
题目: 输入样例: 6 3 1 2 2 3 3 4 3 4 5 输出样例: 3 4 5 5 -1 -1 找第一次出现k值的位置: int l=0,r=n-1; while(l<r) { int mid=l+r>>1; if(a[mid]>=k)r=mid; else l=mid+1; } 找最后一次出现k值的位置: l=0,r=n-1; while(l<r) { int mid=l+r+1>>1; if(a[mid]<=k)l=mid; els
使用下一代的嵌入式IDE-PlatformIO 教程
1.生成工程 1.1 打开STM32CubeMX: 选择你的MCU,这里我用的是STM32F103RC RCC中开启外部HSE时钟,外部时钟比HSI更稳定些 开启DEBUG 4线 打开串口1用于打印调试信息,波特率115200,校验位0,停止位1 打开串口2用于MODBUS协议,波特率9600,校验位0,停止位1 接入RT-thread:参考官方文档 基于 CubeMX 移植 RT-Thread Nano 根据官方文档,需要1.取消生成HardFault_Handler、PendSV_Handler、Sy
二分模板——数的范围
789. 数的范围 先用二分求出x的左边界——a[mid] >= x(mid在x的右边,所以右边界变为mid) 即: if(a[mid] >= x) r = mid; else l = mid + 1; 根据模板得出mid mid = l + r >> 1; 若得出的左边界值不为x,则满足x不存在与数组中,输出“-1 -1” 若等于x,二分求右边界——a[mid] <= x(mid在x的左边,所以左边界变为mid) 即: if(a[mid] <= x
销售预测的方法与模型(三)丨安全库存与再订货(补货)
较高的 Z 值对应较高的服务水平(例如,服务水平 99% 对应 Z 值 2.33),意味着企业希望更低的缺货风险,因此需要更高的安全库存。在再订货点的管理中,考虑到供应商交货的不确定性,通常需要结合安全库存,以防止在交货期间库存用尽。要对L开根号,根号L表示交货周期越长,企业需要的安全库存越多,因为在较长的供应期内,需求波动的累积效应更明显。举例:供应商的交期服从标准差为2件/天的正态分布,顾客需求为50件/天的正态分布,若要客户服务水平达到 90%,安全库存量应该是多少?下面介绍几种核心的模型与公式。
使用 DEM 模拟金属烧结过程
了解离散元素法 (DEM) 如何彻底改变烧结工艺,提高制造业的效率和精度。
ACM算法训练【数的范围·二分模板】
【代码】ACM算法训练【数的范围·二分模板】
20、自定义用户窗体:从创建到使用
本文详细介绍了在Excel VBA中创建和使用自定义用户窗体的完整过程,涵盖从窗体设计、控件添加与属性设置,到事件处理程序编写及宏调用的各个环节。通过实际示例讲解了如何实现文本大小写转换和员工信息录入等功能,并深入解析了常用控件的属性与事件机制。同时提供了控件命名规范、快捷键使用、布局技巧等实用建议,帮助读者构建高效、交互性强的VBA用户界面。
数的范围(二分模板题)
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。//将求左右边界转化为二分模板的向上和向下取整。如果数组中不存在该元素,则返回 -1 -1。
OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)
上一篇编译了proj6.2.0、gdal3.2.1,本篇继续。 OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。
【人工智能的数学基础】最优传输(Optimal Transport)问题与Wasserstein距离
代表两堆石子,则问题等价于如何移动一堆石子,通过最小的累积移动距离把它堆成另外一堆石子。的不同位置分配的值。为离散型概率分布,则该优化问题可以表示为矩阵形式。表示寻找总运输成本最小的方案。放大后的上确界不会小于原来的上确界,因此不妨取。具有相同的概率分布。是概率分布,因此积分可以写作采样形式。描述了一种可行的运输方案,表示应该从位置。则最优传输问题的目标函数可以用列向量。对于一个线性规划问题,总可以写出其。的所有可能联合分布的集合,下确界。其中矩阵的每一行代表概率分布。表示寻找使得目标函数最大的。
ACWING - 数的范围 (二分模板)
数的范围 题目大意:给一个升序排列的数组,然后q次询问,问x这个数第一次和最后一次出现的位置。 解题思路:两种方法 标准二分 或者 lower_bound&&upper_bound 都可以。 这是一个二分模板 二分: #include<iostream> #include<algorithm> using namespace std; const int maxn=1e5+10; int a[maxn]; int main(){ ios::sync_wit
《MATLAB项目实战》,专栏目录和介绍
MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具,它提供了一个高效、简洁的编程环境,使用户能够进行从简单的矩阵运算到复杂的多维数据分析的各种计算任务。无论是在人工智能、计算机视觉、图像处理还是其他领域,MATLAB 都能够提供精准、快速的解决方案,因此成为了全球科研人员、工程师以及数据分析师的得力工具。
数的范围(二分模板)
题目 给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。 如果数组中不存在该元素,则返回“-1 -1”。 输入格式 第一行包含整数n和q,表示数组长度和询问个数。 第二行包含n个整数(均在1~10000范围内),表示完整数组。 接下来q行,每行包含一个整数k,表示一个询问元素。 输出格式 共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。 如果数组中不存在该元素,则返回“-1 -1”。 数据范围 1≤n≤100000
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
数的范围(二分模板)
数的范围 题目链接 给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。 如果数组中不存在该元素,则返回“-1 -1”。 输入格式 第一行包含整数n和q,表示数组长度和询问个数。 第二行包含n个整数(均在1~10000范围内),表示完整数组。 接下来q行,每行包含一个整数k,表示一个询问元素。 输出格式 共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。 如果数组中不存在该元素,则返回“-1 -1”。 数据范围 1≤n
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
789. 数的范围 - 二分模板
789. 数的范围 给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。 如果数组中不存在该元素,则返回“-1 -1”。 输入格式 第一行包含整数n和q,表示数组长度和询问个数。 第二行包含n个整数(均在1~10000范围内),表示完整数组。 接下来q行,每行包含一个整数k,表示一个询问元素。 输出格式 共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。 如果数组中不存在该元素,则返回“-1 -1”。 数据范围 1≤n
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
二分模板:查找数的范围、数的三次方根
内容摘自ACWING,一个很好的算法学习平台。
洛谷 U411986 数的范围(二分模板)
这里注意到模板中mid的取值是(l+r+1)/2,而不是(l+r)/2,是因为mid的取值是向下取整的,当l和r只相差1时,mid=(l+r)/2就等于(2*l+1)/2=l,如果此时需要更新的是区间左端点l,那么l=mid操作一通后,l的值还是原来的值,会导致死循环。1)lower_bound函数:用来寻找边界点B,即是在区间[B, n-1]中,所有元素都满足同一个性质的最。所以把mid的值设置为(l+r+1)/2,这样分区间时还是可以视为是对半分的,还可以避免死循环。
789. 数的范围_二分模板题
789. 数的范围 找x的左端点:x的左端点的左边的数都是严格小于x的,x的左端点右边的数都是严格大于x的,所以根据a[mid] >=x来找x的左端点 如果是a[mid] >= x 说明 x在mid的右边,mid在x的左边,区间需要向左偏移,而且a[mid]是可能等于x的,所以r=mid。else 也就是a[mid] < x 则l=mid+1 找x的右端点:x的右端点左边的数都小于等于x,右边的数都严格大于x,所以根据a[mid] <= x 来找x的左端点 如果是a[
数的范围 两种二分模板
用两种二分先找第一个x的位置再找第二个x的位置。
789. 数的范围 【整数二分模板】
题目 给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。 对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。 如果数组中不存在该元素,则返回 -1 -1。 输入格式 第一行包含整数 n 和 q,表示数组长度和询问个数。 第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。 接下来 q 行,每行包含一个整数 k,表示一个询问元素。 输出格式 共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。 如果数组中不存在该元素,则返回 -1 -1。
整数二分模板题----数的范围
数的范围 题目:数的范围 描述:给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回 -1 -1。 思路: 典型的二分模板题, 先找左边第一个目标数字([l,mid],[mid+1,r],mid不用+1), 再找右边第一个目标数字([l,mid-1],[mid,r],mid需要+1) 代码如下: #include <iostream> using namespace
【题解】数的范围(二分模板)
L+ 1R。
789. 数的范围题解和二分模板解释
先给上题目链接 https://www.acwing.com/problem/content/791/ 然后是两种的二分模板代码 bool check(int x) {/* ... */} // 检查x是否满足某种性质 // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用: int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1; if
[AcWing]789. 数的范围(C++实现)二分模板题
[AcWing]789. 数的范围(C++实现)模板题1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路:整数的二分查找 3. 解法 ---------------------------------------------------解法---------------------------------------------------: #include <iostrea
【ACwing】一、二分:整数、小数二分模板+789. 数的范围+790. 数的三次方根
文章目录(1)整数二分(2)小数二分(3) (1)整数二分 (2)小数二分 (3)
101



被折叠的 条评论
为什么被折叠?



