题目
给定一个按照升序排列的长度为n的整数数组,以及q个查询。
对于每个查询,返回一个元素k的起始位置和终止位置(位置从O开始计数)。如果数组中不存在该元素,则返回“-1-1”。
输入格式
第一行包含整数n和q,表示数组长度和询问个数。
第二行包含n个整数(均在1~10000范围内),表示完整数组。接下来q行,每行包含一个整数k,表示一个询问元素。
输出格式
共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该元素,则返回“-1-1”。
数据范围
1<n≤1000001<q<100001<k<10000
两个模板
代码
package main.java;
import java.io.*;
/**
* @author akuya
* @create 2023-06-11-18:46
*/
public class Binary {
static int N=100010;
static int p[]=new int[N];
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pr=new PrintWriter(new OutputStreamWriter(System.out));
String line1=br.readLine();
String nq[]=line1.split(" ");
int n=Integer.parseInt(nq[0]);
int q=Integer.parseInt(nq[1]);
String line2=br.readLine();
String value[]=line2.split(" ");
for(int i=0;i<n;i++){
p[i]=Integer.parseInt(value[i]);
}
while(q--!=0){
int tmp=Integer.parseInt(br.readLine());
int l=0,r=n-1;
while(l<r){
int mid=l+r>>1;
if(p[mid]>=tmp)r=mid;
else l=mid+1;
}
if(p[l]!=tmp)pr.println("-1 -1");
else{
pr.print(l+" ");
l=0;
r=n-1;
while(l<r){
int mid=l+r+1>>1;
if(p[mid]<=tmp)l=mid;
else r=mid-1;
}
pr.println(l);
}
}
br.close();
pr.flush();
pr.close();
}
}
注意
根据二分收缩的方向具体选择某个模板,而不是无畏得用一模板或者二模板。