目录
一、前言
因为这几周是期末周了,但是自己确实又不想鸽下博客不管,所以干脆这几天就是放一些简单的模板题目,仅供大家熟悉之前所写的一些模板套路,今天也是很久以前拿到手的一个洛谷题目,第一次刷那个题目的时候,因为是用二分,但是由于自己对二分边界的处理依旧不是特别的熟悉,所以之前做那个题目的时候第一次交还没AC呢,但是这次已经能够非常得心应手的用之前所教的模板写出来了这一题了,所以希望到这的读者,如果不熟悉本蒟蒻的模板,可以点击这里回去复习一下!因为这题目很容易读懂,所以在此不加以分析了!
二、题目描述
可以看到哈,这是洛谷的一道深基的题目,所以大家一定不要像我一样,一定要重视基础!
三、完整解题代码
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int n,m;
int ef(int x) //二分模板,注意边界各要扩充一个单位长度
{
int l=0,r=n+1; //再次注意此模板的应用!!
while(l+1!=r)
{
int mid=l+((r-l)>>1);
if(a[mid]>=x) r=mid;
else l=mid;
}
if(a[r]==x) return r;
else return -1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
int find_num;
for(int i=1;i<=m;i++)
{
cin>>find_num;
cout<<ef(find_num)<<" ";
}
}
四、AC凭证
五、后话
不知道大家对这个二分模板有什么样的评价呢?本蒟蒻是觉得非常好用的,看过之前介绍此二分模板视频的小伙伴就会知道,如果要利用这个二分模板,最后一定是返回一个l或者r而不是所谓的中间值!!最后抛下一个问题吧,如果题目改成,返回待查找数最后一次出现的那个位置的二分应该怎么去写呢?