【JLOI】01新年首讲-二分答案

【JLOI】01
新年首讲,不是吗?

二分答案!

CCF NOIP 普及组基础知识
接下来我们将用2节课时间来讲一下二分以及二分答案
【引入例题】
给定一个长度为n的序列,保证是从小到大排的。有m次询问,每次询问数组中x第一次出现的位置。如果没有出现x就输出-1
n、m<=100000
【思路】
普通做法
无脑n×m模拟,时间复杂度O(nm),0分
高级做法
二分答案
首先二分是有局限性的:当且仅当数组有序时才能二分答案
观察到题目中数组从大到小排
可以二分答案
来一个可爱的小图:
在这里插入图片描述

有两个指针,名字叫L和R,而它们则代表了答案所在的区间
十分容易理解?对吗?
接着,它们生了个小宝宝叫MID
而MID等于(L+R)/2 父母各取一半
在这里插入图片描述
现在我们判断一下MID所在元素是否小于等于x!
如果不合法:对不起,区间缩小,变成左区间!
否则:OK,再接再厉,变成右区间!
代码片:

int l=1,r=n,ans=-1;
while(l<=r){
   
	int mid=(l+r)/2;
	if(a[mid]<=x) ans=mid,l=mid+1;
	else r=mid-1; 
}

我们分析一下时间复杂度
n个数(n)
m次询问+二分查找(mlogn)
总时间复杂度:(n+mlogn)
如果m>n怎么办?
若数据规模为:m<=10000000,n<=100000,还行吗?
明显不行
怎么办?
预处理。
离散化每个数字,例如
原数组:1,1,2,3,5,8
离散化的值:1,1,2,3,4,5
没错,离散化的值就是这个序列去重后这个数字的排名
然后对于-1,我们可以用哈希的方式判断,也可以用map来判重,这些都不是重点!
入门结束!
【例题1】数列分段Section II
十分明显:我们可以二分他的答案,然后对MID判断,判断方式可以用贪心
贪心方法:超了就自建一组,没超就归进最后一组
代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100001]; 
int l=1,r=0,ans=0;
bool check(int mid)
{
   
 int sum=1,k=0;
 for(int i=1;i<=n;i++)
 {
   
  k+=a[i];
  if(k>mid) 
  {
   
   sum++;
   k=a[i];
  }
 }
 return sum>m;
}
int main()
{
   
 scanf("%d%d",&n,&m);
 for(int i=1;i<=n;i++)
  scanf("%d",&a[i]),l=max(l,a[i]),r+=a[</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值