查找特定的数-初级
内存限制:128 MB 时间限制:1.000 S
题目描述
输入n个不超过109的单调不减的(就是后面的数字不小于前面的数字)非负整数,然后进行m次询问。对于每次询问,给出一个整数,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出-1。
输入
第一行输入整数n和m,分别表示整数数量和询问次数。
第二行输入n个整数。
第三行输入m个整数。
输出
输出一行,m个整数,以空格隔开,表示答案。
样例输入
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
样例输出
1 2 -1
提示
数据保证:
这种题目,必须用二分,不然:
先复习下二分,先定义:
int l=1,r=a,m=0;
左边界:
while(l<r){
m=(l+r)/2;
if(s[m]>=j[i]) r=m;
l=m+1;
}
右边界:
while(l<r){
m=(l+r)/2+1;
if(s[m]<=b) l=m;
r=m-1;
}
好,上代码:
#include<bits/stdc++.h>
using namespace std;
int s[1000005],j[1000005];
int main(){
int a,b;
cin>>a>>b;
for(int i=1;i<=a;i++){
cin>>s[i];
}
for(int i=1;i<=b;i++){
cin>>j[i];
}
sort(s+1,s+a+1);
for(int i=1;i<=b;i++){
int l=1,r=a,m=0;
while(l<r){
m=(l+r)/2;
if(s[m]>=j[i]) r=m;
else l=m+1;
}
if(s[l]!=j[i]){
cout<<"-1 ";
}
else{
cout<<l<<" ";
}
}
return 0;
}