二分模板刷题(一)

目录

一、前言

二、题目描述

三、完整解题代码

四、AC凭证

五、后话


一、前言

因为这几周是期末周了,但是自己确实又不想鸽下博客不管,所以干脆这几天就是放一些简单的模板题目,仅供大家熟悉之前所写的一些模板套路,今天也是很久以前拿到手的一个洛谷题目,第一次刷那个题目的时候,因为是用二分,但是由于自己对二分边界的处理依旧不是特别的熟悉,所以之前做那个题目的时候第一次交还没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而不是所谓的中间值!!最后抛下一个问题吧,如果题目改成,返回待查找数最后一次出现的那个位置的二分应该怎么去写呢? 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sheep.ice

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值