洛谷 P1571眼红的Medusa 小解

本人水平有限,第一次写题解,哪处有指点的,欢迎各位点评。

代码参考 

#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;
}

回顾二分模版

22e5851b7c0344be8edbaada410707bb.png

 红色区域的右边界值  记为 往左寻找  

左不变 即 l = 0      r = mid; 

蓝色区域的左边界值  记为 往右寻找

右不变 即r = n - 1   l = mid; (最终相等且非0,陷入死循环,所以需l + r + 1)

点赞随意  欢迎评论

本人努力充电中,一步一步持续。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值