首页 > 其他分享 >[模板题]数的范围

[模板题]数的范围

时间:2023-03-20 15:05:50浏览次数:32  
标签:数组 int mid 整数 else 端点 模板 范围


来源: 模板题,AcWing

算法标签 二分

题目描述

给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。

对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。

如果数组中不存在该元素,则返回“-1 -1”。

输入格式

第一行包含整数n和q,表示数组长度和询问个数。

第二行包含n个整数(均在1~10000范围内),表示完整数组。

接下来q行,每行包含一个整数k,表示一个询问元素。

输出格式

共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回“-1 -1”。

数据范围

1≤n≤100000
1≤q≤10000
1≤k≤10000

输入样例:

6 3
1 2 2 3 3 4
3
4
5

输出样例:

3 4
5 5
-1 -1

思路

已知​​给定一个按照升序排列的长度为n的整数数组​​​且​​要求返回一个元素k的起始位置和终止位置​​​。
我们需要找到一个目标数字的起始与末尾位置。
我们需要清楚的是,a[i]到x序列时,要找到最左侧的x[0],只需要当a[i]>=x即可判断,然后调用二分查找即可.

if(a[mid]>=x)r=mid;
else l=mid+1;

用模板找出左端点。

此时我们需要找出右端点。
当x序列到n,我们可以发现,当a[i]<=x,即可判断出x序列的右端点,此时用二分查找模板。

if(a[mid]<=x)l=mid;
else r=mid-1;

即可以轻松找出右端点。

右端点找出的前提是发现了正确的左端点。

如果两个都没有则输出“-1 -1”;

[模板题]数的范围_二分法

C++ 代码

#include<iostream>

using namespace std;

const int N=1e5+10;
int a[N],n,q;

int main()
{
cin>>n>>q;
for(int i=0;i<n;i++)cin>>a[i];//读入数组

while(q--)
{
int x;
cin>>x;

int l=0,r=n-1;
while(l<r)//二分模板 左端点
{
int mid=l+r>>1;
if(a[mid]>=x)r=mid;//其实是去[mid]向左移动了
else l=mid+1;//向右
}
if(a[l]==x)//如果找到了左端点
{
cout<<l<<" ";
int l=0,r=n-1;
while(l<r)//二分模板 左端点
{
int mid=l+r+1>>1;//因为整数下取整,如果不加1,L==M,n==2会陷入死循环
if(a[mid]<=x)l=mid;
else r=mid-1;
}
cout<<r<<endl;
}
else cout<<"-1 -1"<<endl; //如果都不存在 则输出
}
return 0;
}


标签:数组,int,mid,整数,else,端点,模板,范围
From: https://blog.51cto.com/u_16014765/6132925

相关文章

  • java 根据word xml模板生成word(个人v2版本)
    这里用的是poi相关jar包以及freemarker插值技术实现,poi相关jar包这里不再述说1,编辑word并保存为xml其中需要动态输出的内容使用${xxx}代替,xxx是你的java类属性值,如:年龄:${age......
  • 使用工厂模式+策略模式+模板方法实现对大量if...else的改造
    1.策略模式+工厂模式+模板模式实际开发工程中,一些业务很复杂的逻辑使用很多的if或者if···else语句,不利于维护和扩展,为了使代码更加优雅,利于维护可以采用策略模式+......
  • 二分查找模板
    /** *递归 * *@parama *@paraml *@paramr *@return */ staticintbinarySearch(int[]a,intl,intr){ if(l>r){//这里为什么不加等号......
  • 数学知识模板之欧几里得算法
    欧几里得算法求最大公约数intgcd(inta,intb){ returnb?gcd(b,a%b):a;}扩展欧几里得算法//x,y是使x*a+y*b=d的一组解intexgcd(inta,intb,int......
  • 数学知识模板之试除法
    试除法判定质数boolis_prime(intx){ if(x<2)returnfalse; for(inti=2;i<=x/i;i++) if(x%i==0)returnfalse; returntrue;}试除法分解质因......
  • 数学知识模板之筛法求素数
    筛法求素数1.朴素筛法求素数intprimes[N],cnt;boolst[N];voidget_primes(intn){ for(inti=2;i<=n;i++) { if(st[i])continue; primes[cnt++]=......
  • 全链路压测(6):确认范围和识别风险
    转载:https://www.cnblogs.com/imyalost/p/15992042.html上篇文章用了很长的篇幅讲述了全链路压测从零开始落地实施的主要过程,其中在准备阶段是最耗费时间和精力的。全链......
  • vSphere部署系列之10——虚拟机模板和规范
    vSphere部署系列之10——虚拟机模板和规范 原创Sunshyfangtian2016-09-0410:56:01博主文章分类:虚拟化©著作权文章标签模板虚拟化克隆文章分类WindowsServer服务器......
  • 模板约束介绍
    SFINE(substitutionfailureisnotanerror)在模板编程中,SFINE是比较常见的一种特性,举个例子【1】:template<typenameT,unsignedintN>std::size_tGetArrayLen(T(&)[N]){......
  • 线段树模板
    扫描线#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=4e5+10;intread(){ intx=0,f=1;charc=getchar(); while(c>'9'||c<'0')......