1159: 查找元素
Description
给定一个集合,询问一个元素是否存在。
Input
第一行两个数n和m,表示集合的大小和询问的次数。(1 ≤ m ≤ n ≤ 100000)
第二行n个数,表示集合的元素。(1 ≤ Ai ≤ 87654321)
第3行到m+2行,每行一个数,表示要询问的元素。
Output
m行,每行表示每一次询问的结果。
对于每次询问,输出元素的位置,不存在的话输出-1。(数据保证无重复元素)
Sample Input
3 3 3 1 2 2 4 1
Sample Output
3 -1 2
没啥好说的,二分查找。。。之前打算不用算法直接过的,还是妄想了。。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int x;
struct node
{
int pos;
int num;
};
node s[100010];
bool cmp(node a, node b)
{
return a.num<b.num;
}
int binary_search(int left,int right,int key)
{
while(left<=right)
{
int mid=(left+right)/2;
// printf("left=%d mid=%d right=%d key=%d s[%d].num=%d\n",
// left,mid,right,key,mid,s[mid].num);
if(key==s[mid].num)
{ return mid; }
else if(key<s[mid].num)
{ right=mid-1; }
else if(key>s[mid].num)
{ left=mid+1;}
}
return 0;
}
int main()
{
int n,m,i;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&s[i].num);
s[i].pos=i;
}
sort(s+1,s+1+n,cmp);
while(m--)
{
scanf("%d",&x);
int a=binary_search(1,n,x);
if(a) cout<<s[a].pos<<endl;
else cout<<"-1"<<endl;
}
return 0;
}