二分
概述
-
二分法是解决如下最优化问题的利器:
-
解具有某种意义上的单调性。例如,取值单调,或可行性单调(即可行/不可行的分别是问题边界开始的连续一段)。
-
解不容易直接求出,但判定一个解是否合法较为容易。
-
-
此时则可以二分:维护最优区间,每次判定其中点是否合法,若是则舍弃左区间,否则舍弃右区间(这里我们认为右区间更优)。
-
二分和倍增在某种意义上互为逆。事实上,二分的一种实现就基于倍增,因为任何一个答案都可以做二进制拆分(我认为二分和倍增在某种程度上依赖着二进制的最优性...不是很好表述,因为没想清楚)。
分数规划
- 分数规划是求分式极值的二分方法,有时也指求分式极值的问题类。具体地,给出如下分式,求其极值:
-
其中 \(y=0/1\),是自选的。自然语言表述为:每种物品有两个权值 \(v\) 和 \(w\),选出若干个物品使得 \(\frac{\sum v}{\sum w}\) 最小/最大。
-
不妨二分之。考虑化式子,对于 \(mid\),有
-
当然可能有非 \(01\) 的分数规划...注意到其类似多重背包,至少可以二进制拆分。
-
实际问题中,一般会有 \(\sum\limits_{i=1}^n y_i\times w_i\geqslant K\) 的限制。在合法性检验中捎带一下就好了。
P4377 [USACO18OPEN] Talent Show G
-
题意略。
-
板题,按上面的来就行。check 是一个背包,因为要背够 \(\sum\limits_{i=1}^n y_i\times w_i\)...这么一说,如果是背包 check,显然可以单调队列优化多重。
P4322 [JSOI2016] 最佳团体
- 题意略。就是把上一题的线性 DP 推广到了树形。
P3705 [SDOI2017] 新生舞会
-
题意略。是一个二分图最大权匹配的 check...当然我这里用了 SSP。
-
以及,这道题比较卡常(也许是卡 SPFA?),需要调一调参才能确保时间和精度都 OK。
P1642 规划
-
题意略。
-
注意这是一个比较特殊的树形背包;时间很宽裕,直接枚举根做暴力 DP。
整体二分
-
整体二分是解决如下问题的利器:
-
多组询问,可带修,询问可二分。
-
修改互相独立。
-
修改不能影响合法性的判定标准。
-
允许使用离线算法。
-
-
核心思路:迫使每个操作只出现在二分树中的一条链上。
-
具体来说,将原有的信息也视作修改,进行值域二分(二分答案)。
-
利用值域二分将手上的修改操作变成 \(01\) 操作,按时序操作之,于是容易判定各询问在值域上是否更大。
-
将答案 \(\leqslant mid\) 的扔到左边,反之亦然,操作根据其对值域上何处贡献也同理。显然这构成一棵二分树。
-
对其做后序遍历,先递归左儿子,于是处理任意区间时,当前生效的修改恰为到其的前缀。注意要撤销修改。
-
P3834 【模板】可持久化线段树 2
-
题意:求静态区间第 \(k\) 小。
-
二分答案(二分值域),每次将 \(\leqslant mid\) 的点 \(ins\) 到其下标上,用树状数组维护容易求出区间 \(\leqslant mid\) 的数的个数。
-
足够则询问向左走,否则询问向右走并减去这些数的量。双 \(\log\),常数较小。
P2617 Dynamic Rankings
-
题意:求动态区间第 \(k\) 小。
-
整体二分完全体的板子。我们借着这道题稍微细讲一下吧:
-
一般的整体二分中,我们二分出当前值域中点 \(mid\) 之后,遍历所有操作,看情况执行(按 \([\leqslant mid]\) 决定权值,也可以说),然后扫所有询问。
-
这其实是隐含着时间关系的:先操作,后询问。那么...当操作与询问有序的时候,自然也可以按这个序来扫。
-
另外应当指出的是,一开始操作是有序的,所以扫完之后还是有序的,没必要排序;只是右区间的操作序列反过来了,故考虑打翻转标记或者对称交换一下。
P3527 [POI2011] MET-Meteors
- 题意略。记得用树状数组+差分实现区间加就好,因为线段树比较卡常。
P1527 [国家集训队] 矩阵乘法
- 题意略。二维树状数组实现一下就好。