二分

前言

为了防止初学者看不懂,本文章将从最低门槛开始讲解。

单调性

单调性这个概念非常重要,在之后很多地方都会用到。而二分的基础就是单调性。

首先说说几个基本概念:

  • 变量:即可以变化的量,它可能是自发的变化,也可能是随着其他东西变化。

  • 自变量:即没有特殊限制,可以自由变化的量。比如我写下的 \(x\) 就是一个自变量,你可以将它赋成任何一个值。就算我加了 \(3\le x\le 4\) 它依然是自变量,因为除了范围限制没有别的。

  • 因变量:即有特殊限制,会随着别的变量而变化的量。比如我写下 \(y=x+2\),那么 \(y\) 就是随 \(x\) 变化的因变量,即 \(y\) 的取值由 \(x\) 来决定,而不是它自己。

现在我们来讲讲单调性。

单调性,说白了就是一种刻画自变量与自变量的大小关系与因变量与因变量的大小关系的关系,有点绕口,简单说就是刻画了两个大小关系的关系。

比如我有一个数列 \(a_1,a_2,\dots,a_n\),对于那么 \(a_i\) 取什么值,显然由 \(i\) 来决定,所以 \(i\) 是自变量,\(a_i\) 是因变量。那么如果对于任意的 \(i\lt j,a_i\lt a_j\),显然自变量之间的大小关系是小,对应的,因变量之间的大小关系也是小,这就是这两个大小关系的关系:这两个大小关系保持一致。

我怎么觉得这么讲下来门槛好像变高了。

上面那种关系就叫做具有单调性。

对于单调性,我们还分了类:

  1. 单调递增:对于任意的 \(i<j\),都有 \(a_i<a_j\)。

  2. 单调递减:对于任意的 \(i<j\),都有 \(a_i>a_j\)。

  3. 单调不降:也叫做非严格单调递增,即对于任意的 \(i<j\),都有 \(a_i\le a_j\)。

  4. 单调不增:也叫做非严格单调递减,即对于任意的 \(i<j\),都有 \(a_i\ge a_j\)。

二分

单调性讲完了,我们来说说二分的原理。

一般情况下,要求一个答案我们会直接枚举所有情况并逐一排除。但是有的时候数据量非常庞大,不支持一个一个枚举,那有没有什么办法能快速排除大量情况呢?

我们考虑这样一种情况:假如我知道答案是 \(ans\),且任何的 \(x<ans\),\(x\) 对于原问题都不可能成立;而对于任意的 \(x\ge ans\),\(x\) 对于原问题都成立。那么显然,如果我设 \(f(x)\) 表示 \(x\) 对于原问题的可行性,那么当 \(x<ans\) 时,\(f(x)=0\),而当 \(x\ge ans\) 时,\(f(x)=1\)。

那么显然你在纸上画一下就会发现,\(f(x)\) 具有单调性。

好,我考虑我枚举到了一个数 \(x\),如果我知道 \(f(x)=0\),那么对于任意的 \(y<x\),\(f(y)=0\) 对吧?所以我一次性就排除了 \([1,x]\) 范围内的所有数。那如果 \(f(x)=1\),同样我们也能知道对于任意的 \(y>x\),\(f(y)=1\)。

那么我们考虑在区间 \([l,r]\) 中找到最小的 \(x\) 使得 \(f(x)=1\),显然我们可以先将区间二等分,然后取中间值来判断。形式化地说:我们判断 \(f(\lfloor\frac{l+r}{2}\rfloor)\) 的值是多少,如果等于 \(0\),显然区间 \([l,mid]\) 中不存在满足条件的数,因此答案肯定在 \([mid+1,r]\) 中。否则我们知道区间 \([mid,r]\) 中所有的数都满足条件,因此最小的答案必然在 \([l,mid]\) 中。

所以我们会发现单调性与二分的真正联系在于:如果我们要找某个条件下的最小(或最大),并且在这个条件下所有结果最终满足单调性,那么我们可以每次二分从而砍掉一半操作。

那我们每次砍一半这个操作的时间复杂度是多少呢?假设区间总长度为 \(len\),那么 \(len\) 每次除以 \(2\),可以知道最多 \(\log len\) 次就可以将整个区间切成长度为 \(1\) 的区间。因此总时间复杂度为 \(O(\log n)\)。

好的我感觉这下门槛更高了……

posted @ 2026-08-03 21:50  cwxcplh  阅读(15)  评论(0)    收藏  举报