查找

题目描述

输入 nn 个不超过 10^9109 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a_1,a_2,\dots,a_{n}a1,a2,,an,然后进行 mm 次询问。对于每次询问,给出一个整数 qq,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -11 。

输入格式

第一行 22 个整数 nn 和 mm,表示数字个数和询问次数。

第二行 nn 个整数,表示这些待查询的数字。

第三行 mm 个整数,表示询问这些数字的编号,从 11 开始编号。

输出格式

输出一行,mm 个整数,以空格隔开,表示答案。

输入输出样例

输入 #1
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
输出 #1
1 2 -1 

说明/提示

数据保证,1 \leq n \leq 10^61n106,0 \leq a_i,q \leq 10^90ai,q109,1 \leq m \leq 10^51m105

本题输入输出量较大,请使用较快的 IO 方式。

代码实现#include<bits/stdc++.h> 

using namespace std;
int m,a[100000000],n,q[10000000],l,r,mid;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i]; 
	}
	for(int i=1;i<=m;i++){
		cin>>q[i];
	}
for(int i=1;i<=m;i++){ l=1; r=n; while(l<r){ int mid=(l+r)/2;//mid表示为n的一半,如果要找的数大于mid,就找mid右边的数,反之找左边的数,重复执行直到最后一个数 if(a[mid]>=q[i]){ r=mid; } else{ l=mid+1; } } if(a[r]==q[i]){ cout<<r<<" "; } else{ cout<<"-1"<<" "; } } return 0; }
posted @ 2023-11-18 00:59  大柚柚  阅读(17)  评论(0编辑  收藏  举报