本人水平有限,第一次写题解,哪处有指点的,欢迎各位点评。
代码参考
#include <bits/stdc++.h>
using namespace std;
const int N = 100006;
typedef long long LL;//此处long long 题目要求小于2e9 用int也不会爆
int n,m;
LL a[N],b[N];
bool ffind(int x) // 二分查找
{
int l = 0,r = m - 1,mid;
while(l < r)
{
mid = (l + r) / 2;//此处也可以改为加(l + r + 1) / 2 相应下面也需修改
if(b[mid] >= x) r = mid;
else l = mid + 1;
}
// 二分完之后 l = r 然后判断x是否存在于数组b 即特殊贡献奖名单中是否存在x
if(b[l] != x) return false;// 判断 false 的情况,剩余都为true
return true;
}
int main()
{
cin >> n >> m;
for(int i = 0;i < n;i++) cin >> a[i];
for(int i = 0;i < m;i++) cin >> b[i];
sort(b,b + m);// 二分查找 前提条件:针对有序数列
for(int i = 0;i < n;i++)
if(ffind(a[i])) cout << a[i] << ' ';
return 0;
}
回顾二分模版
红色区域的右边界值 记为 往左寻找
左不变 即 l = 0 r = mid;
蓝色区域的左边界值 记为 往右寻找
右不变 即r = n - 1 l = mid; (最终相等且非0,陷入死循环,所以需l + r + 1)
点赞随意 欢迎评论
本人努力充电中,一步一步持续。