题目描述
虽然 Miss Medusa 到了北京,领了科技创新奖,但是她还是觉得不满意。原因是:他发现很多人都和她一样获了科技创新奖,特别是其中的某些人,还获得了另一个奖项——特殊贡献奖。而越多的人获得了两个奖项,Miss Medusa就会越眼红。于是她决定统计有哪些人获得了两个奖项,来知道自己有多眼红。
输入格式
第一行两个整数 �,�n,m,表示有 �n 个人获得科技创新奖,�m 个人获得特殊贡献奖。
第二行 �n 个正整数,表示获得科技创新奖的人的编号。
第三行 �m 个正整数,表示获得特殊贡献奖的人的编号。
输出格式
输出一行,为获得两个奖项的人的编号,按在科技创新奖获奖名单中的先后次序输出。
输入输出样例
输入 #1复制
4 3 2 15 6 8 8 9 2
输出 #1复制
2 8
说明/提示
对于 60%60% 的数据,0≤n,m≤1000,获得奖项的人的编号 <2×109<2×109;
对于 100%100% 的数据,0≤n,m≤105,获得奖项的人的编号 <2×109<2×109。
输入数据保证第二行任意两个数不同,第三行任意两个数不同。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int arr1[N], arr2[N], m, n;
bool query(int x,int l,int r)
{
while (l <= r)
{
int idx = (l + r) / 2;
if (arr2[idx] == x)return true; //如果相等就表示找到了,当然返回啦
//特判,比如数据是1 2 3 7 8 9,我要找4,就先和3比,
//发现不相等,此时又比2大比7小,就没有必要继续往下查找了,不然会超时的
if (arr2[idx - 1]<x && arr2[idx + 1]>x) return false;
if (arr2[idx] < x)
{
l = idx + 1;
}
else if (arr2[idx] > x)
{
r = idx;
}
}
return false;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> arr1[i];
for (int j = 1; j <= m; j++)
cin >> arr2[j];
sort(arr2+1, arr2 +1+ m);
for (int i = 0; i < n; i++)
{
if (query(arr1[i], 1, m))
cout << arr1[i] << " ";
}
return 0;
}
算法小白的刷题日记--二分