二分学习笔记

写在前面

二分是一种常用且非常精妙的算法,常常是我们解决问题的突破口。二分的基本用途是在单调序列或单调函数中做查找。因此当问题的答案具有单调性时,就可以通过二分把求解转化为判定。进一步地,我们还可以通过三分法解决单调函数的极值以及相关问题。

刷题进度

二分答案(2/4)

二分查找

问题解决进度

Q1


 

一、二分

二分法,在一个单调有序的集合或函数中查找一个解,每次分为左右两部分,判断在哪个部分中并调整上下界,直到找到目标元素,每次二分后都将舍弃一半的查找空间,因此效率很高。

显然,二分算法的复杂度为O(二分次数×单次判定复杂度)

……可怜的我依旧不会算复杂度QAQ……


二、二分核心代码

1.整数定义域

int work(int l,int r){int l=-INF,r=INF;//根据题目要求改变左右端点的初始值while(l<r){int mid=(l+r)>>1;if(check(mid+1)) l=mid+1;//如果符合要求就继续二分查找else r=mid;}return l;
}

2.实数定义域

double work(double l,double r){//根据题目要求确定精度dltdouble mid;while(fabs(l-r)>dlt){//实数比较大小,此句相当于l<r
//补充:fabs(x1)很abs(x2)都表示求绝对值,只不过x1是实数,x2是整数mid=(l+r)/2.0;if(check(mid)) r=mid;else l=mid;}return l;
}

TIP:如果指定二分的次数为t,那么对于初始的求解区间长度L,算法结束后r-l的值为L/2t


 

三、二分法常见模型

1.二分答案

最小值最大(或最大值最小)问题,这类双最值问题常常选用二分法求解,也就是确定答案后,配合贪心、DP等其他算法检验这个答案是否合理,将最优化问题转换为判定性问题。

【例 1】

将长度为n的序列分成最多m个连续段,求所有分法中每段和的最大值的最小是多少?

一些题目

LuoguP1024

LuoguP2678

LuoguP3957

Luogu二分答案

2.二分查找

用具有单调性的布尔表达式求解分界点。

【例 2】

在有序数列中求数字x的排名。

一些题目

Luogu二分查找

3.代替三分

有时,对于一些单峰函数,我们可以用二分导函数的方法求解函数极值,这时通常将函数的定义域定义为整数域求解比较方便。


 

四、典型例题

【例 1】愤怒的牛(Bzoj 1734)

1.题目大意

已知有n间牛舍和每间牛舍的位置,现在要求一种方案使得m头牛两两之间的最小距离尽可能大,求这个最大的最小距离。

2.思路

这是一道最大值最小化的典型题目。

设C(d)表示可以安排牛的位置,并使得最近的两头牛距离≥d

那么问题就转化为了求满足C(d)的最大的d,最近的间距≥d可以看成是所有间距都≥d,因此满足C(d)的条件就是任意两头牛的位置≥d

于是可以贪心求解:

<1>对牛舍的位置x进行排序

<2>把第一头牛放入x0的牛舍

<3>如果第i头牛放入了xj的牛舍,则第i+1头牛就要放入满足xj+d≤xk的xk最小的牛舍中

对x的排序只要在开始时进行一次就可以了,每一次判断对每头牛最多进行一次处理,因此算法的时间复杂度为O(nlogn)

3.代码

咕咕咕咕咕

【例 2】Best Cow Fences(Poj 2018)

1.题目大意

给定一个长度为n的正整数序列A,求一个平均数最大的,长度≥L的子序列。

2.思路

二分答案mid,合法的条件为“存在一个长度≥L的子序列,平均数≥mid”

如果把数列中的每个数都减去二分的值,合法的条件就转化为“存在一个长度≥L的子序列,子序列每一项相加的和≥0”

接下来就是着重解决两个问题:

<1>求一个子序列,要求和最大,没有“长度≥L”的限制

无长度限制的最大子序列和问题是一个经典问题,只需O(n)扫描该数列,不断地把新的数加入子序列,当子序列的和变成负数时,把当前的整个子序列清空。扫描过程中出现的最大子序列和即为所求。

<2>求一个子序列,要求和最大,且子序列的长度≥L

子序列和可以转化为前缀和相减的形式,即设sumi表示A1~Ai的和,则有:

maxi-j≥L{Aj+1+Aj+2+……+Ai}=maxL≤i≤n{sumi-min0≤j≤i-L{sumj}}

这个式子啥意思呀?QAQ

这个式子随着i的增长,j的取值范围0~i-L每次只会增加1。也就是说,每次只会有一个新的值进入min{sumj}的候选集合,所以没有必要每次循环枚举j次,只需要用一个变量记录当前最小值,每次与新的取值sumi-L取min就可以了。

解决了这两个问题后,我们只需要判断最大子序列和是不是非负数,就可以确定二分上下界的变化范围了。

3.代码

咕咕咕咕咕

转载于:https://www.cnblogs.com/THWZF/p/10365241.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析.sens数据集

python脚本在下面网址中https://github.com/ScanNet/ScanNet/tree/master/SensReader/python 一定要使用python2运行此脚本. 使用指令如下 python reader.py --filename /media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png.sens --output_path /me…

ConcurrentHashMap 解读

初始化&#xff1a; 问题&#xff1a;如何当且仅只有一个线程初始化table 1 private final Node<K,V>[] initTable() {2 Node<K,V>[] tab; int sc;3 while ((tab table) null || tab.length 0) {4 if ((sc sizeCtl) < 0)5 …

XML Schema 基本结构

<?xml version1.0?> <Schema name"cangchuSchema" metamodelVersion"4.0"><PhysicalSchema><Table name"highway_toll"><Key><Column name"uid"/></Key></Table><Table name&qu…

关于系统自带 .NET Framework 版本的说明

系统自带版本&#xff1a; Windows XP (SP3) .NET Framework 1.1Windows 7 (SP1) .NET Framework 3.5.1Windows 8.1 .NET Framework 4.5.1Windows 10 (1507) .NET Framework 4.6Windows 10 (1511) .NET Framework 4.6.1Windows 10 (1607) .NET Framework 4.6.2Windows 10 (1703…

BundleFusion那些事儿

背景&#xff1a;前面几篇博客中写了很多关于BundleFusion的东西&#xff0c;主要包括bundlefusion的论文阅读笔记&#xff0c;.sens数据集的生成等&#xff0c;经过最近几天的工作&#xff0c;我对bundlefusion又有了新的技术积累&#xff0c;在这里整理一下&#xff0c;也算是…

问题:图片怎么保存到数据库, 以及怎么把图片从数据库中取出来使用?(已解决)...

简单&#xff0c;不保存图片到数据库&#xff0c;而是图片的路径。 也就是说&#xff0c;先把图片下载到服务器的指定目录下&#xff0c;然后&#xff0c;在把相对的路径保存到数据库中。 如果下次获取图片&#xff0c;就访问数据库&#xff0c;获取图片路径&#xff0c;然后根…

Oracle Study之--Oracle 11gR2通过RMAN克隆数据库

Oracle Study之--Oracle 11gR2通过RMAN克隆数据库Purpose of Database Duplication A duplicate database is useful for a variety of purposes, most of which involve testing. You can perform the following tasks in a duplicate database: Test backup and recovery pro…

ubuntu16.04安装evo

背景:这已经是我第二次尝试安装evo了,最近因为在bundlefusion加入groundtruth的问题搞的很烦躁,我怀疑是不是我给定的groundtruth是不是不正确,所以我就写python脚本,获取计算生成的位姿数据,写入的groundtruth位姿数据.获取数据后,将数据可视化就成了一个很重要的问题,我还是打…

前端性能优化之gzip

gzip是GNUzip的缩写&#xff0c;它是一个GNU自由软件的文件压缩程序。它最早由Jean-loup Gailly和Mark Adler创建&#xff0c;用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件&#xff0c;它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据…

luogu2770 航空路线问题 网络流

题目大意&#xff1a; 给定一张航空图&#xff0c;图中顶点代表城市&#xff0c;边代表 2 城市间的直通航线。现要求找出一条满足下述限制条件的且途经城市最多的旅行路线。(1)从最西端城市出发&#xff0c;单向从西向东途经若干城市到达最东端城市&#xff0c;然后再单向从东向…

手机录音ogg格式怎么转换mp3

Ogg这种音频格式刚出来的时候大家是非常热爱的&#xff0c;但是随着时代的发展&#xff0c;这种音频格式已经已经被取代了&#xff0c;现在呢走在音频格式前端的是MP3格式&#xff0c;这是大家都比较熟悉的&#xff0c;但是我们还是会经常下载到ogg这种格式的音频&#xff0c;就…

TP3.2设置URL伪静态满足更好的SEO效果

URL伪静态通常是为了满足更好的SEO效果&#xff0c;ThinkPHP支持伪静态URL设置&#xff0c;可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀&#xff0c;而不会影响当前操作的正常执行。 例如&#xff0c;我们设置 URL_HTML_SUFFIX>shtml 的话&#xf…

[机器学习] 推荐系统之协同过滤算法(转)

[机器学习]推荐系统之协同过滤算法 在现今的推荐技术和算法中&#xff0c;最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题. 1. 什么是推荐算法 推荐算法最早在1992年就提出来了&#xff0c;但是火起来实际上是最近这…

BundleFusion代码框架讲解

背景&#xff1a;前面用了几篇文章来记录和总结了&#xff0c;我在研究bundlefusion过程中遇到的一些问题以及解决方法&#xff0c;本来想实现给bundlefusion输入先验轨迹&#xff0c;然后让其根据给定的轨迹进行重建&#xff0c;这样即便在环境比较恶劣的情况下&#xff0c;也…

BundlePhobia

1、BundlePhobia用于分析npm package的依赖、bundle后的大小、下载速度预估等等&#xff0c;帮助你在引用一个package之前了解引入该package的代价。 2、也可以将项目的package.json文件上传&#xff0c;BundlePhobia会帮你评估项目中所有包的大小和加载速度。

VFL演示样例

VFL演示样例 上篇文章向大家介绍了VFL的基本的语法点&#xff0c;假设对下面演示样例不熟的童鞋&#xff0c;能够前去參考。废话不多说。我们直接来看演示样例。演示样例一 将五个大小同样、颜色不同的view排成一行&#xff0c;view间的间隔为15px,第一个view的间隔与屏幕的左边…

evo实用指令指南

下面这篇文章中有比较具体的关于evo的安装以及使用的介绍&#xff0c;其中一点很重要&#xff0c;就是可以把euroc形式的.csv的轨迹格式转换为tum格式的轨迹。 https://zhuanlan.zhihu.com/p/88223106#single evo_traj tum orb_slam2_tum.txt --reftum_groundtruth.txt -p --pl…

MailUtils

/***包名:com.thinkgem.jeesite.test*描述:package com.thinkgem.jeesite.test;*/ package com.thinkgem.jeesite.test;import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.regex.Matcher; import java.u…

ES6遍历对象

遍历对象 E S 6 一共有 5 种方法可以遍历对象的属性 。 for ... in for . . . in 循环遍历对象自身的和继承的可枚举属性&#xff08;不含 Symbol 属性&#xff09;。 Object.keys(obj)Object . keys 返回 一个数组&#xff0c;包括对象自身的&#xff08;不含继承的 &#xff…

SpringMvc中ModelAndView模型的应用

/** * 目标方法的返回值可以是 ModelAndView 类型。 * 其中可以包含视图和模型信息 * SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中. * return */ RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ String v…