01 分数规划
一个炒鸡水的东西哦(((
大概就是我们要求一个分式 \(\dfrac{\sum\limits_{x\in S}f(x)}{\sum\limits_{x\in S}g(x)}\) 的最大值(最小值),我们可以二分这个值,并检验是否可能存在 \(\dfrac{\sum\limits_{x\in S}f(x)}{\sum\limits_{x\in S}g(x)}\ge k\),把分母乘过去并移个项可知 \(\sum\limits_{x\in S}f(x)-kg(x)\ge 0\),我们只需求满足 \(\sum\limits_{x\in S}f(x)-kg(x)\) 的最大值即可。
感觉 01 分数规划都挺套路的(((
1. P4322 [JSOI2016]最佳团体
按照 01 分数规划的套路二分最大值 \(k\),我们只需检验是否存在一种选选手的方案使得 \(\sum p_i-kr_i\ge 0\),我们设 \(dp_{i,j}\) 表示在 \(u\) 的子树中选择 \(j\) 个选手,它们 \(\sum p_i-kr_i\) 的最大值,按照树上背包的套路转移即可,最终只需返回 \(dp_{0,k+1}\ge 0\),复杂度 \(n^2\log v\)。
2. P3199 [HNOI2009]最小圈
二分最小平均值 \(v\),并建一个新图,每条边的权值为原图中的权值 \(-v\),然后检验新图中是否存在负环即可。正确性显然。
3. P4377 [USACO18OPEN]Talent Show G
二分答案 \(k\),我们需检验是否存在一个集合 \(S\subseteq\{1,2,3\cdots n\}\) 使得 \(\sum\limits_{x\in S}w_x\ge W\) 并且 \(\sum\limits_{x\in S}t_x-kw_x\ge 0\),这显然可以用背包解决,我们设 \(dp_{i,j}\) 表示考虑到前 \(i\) 个奶牛,选择的奶牛的 \(w\) 值之和为 \(j\),最大的 \(t_x-kw_x\),转移与普通背包不同的一点是转移到 \(\min(W,j+w_i)\) instead of \(j+w_i\) 即可。复杂度 \(nW\log t_i\)。
4. P3288 [SCOI2014]方伯伯运椰子
首先注意到题目中要求“总流量不减少”,不过不难发现这个条件是假的,因为总流量增加肯定不如总流量不变来得更优,又因为原图满足流量守恒,因此我们要找出一个环若干个环的并,使得环上的代价与操作次数之比尽可能大。我们考虑将 压缩操作看成退流,将扩容看成增广,并用网络流的眼光看待这个问题,那么对于一条边 \((u,v,a,b,c,d)\),我们连边 \((v,u,c,a-d)\) 表示最多可以退流 \(c\) 次,每次退流代价会增加 \(a-d\),再连边 \((u,v,\infty,b+d)\) 表示最多可以增广 \(\infty\) 次,每次增广代价会增加 \(b+d\),那么对于一个环,其流量与费用乘积之和就是该环的代价,即题目中的 \(Y-X\)。
不过我们要找的不是最大的 \(X-Y\),而是最大的 \(\dfrac{X-Y}{k}\),因此套路地考虑 01 分数规划,我们二分答案 \(mid\) 并检验 \(\dfrac{X-Y}{k}\ge mid\) 是否可行,将分母乘过去可得 \(k\times mid+Y-X\le 0\),因此我们考虑在原来那张图的基础上,每条边权值都 \(+mid\),并检验是否存在代价为负的若干个环即可。其次我们发现如果存在两个及以上的环,它们的代价之和为负,那么必定存在一个负环。因此本题等价于检验是否存在代价为负的单个环。emmm……无源汇最小费用可行流?no,no,no。事实上,我们只需对于容量大于 \(0\) 的边建一张无流量限制的带权有向图,检验是否存在负环即可,不难发现二者是等价的,因此该做法的正确性可以得到保证。时间复杂度 \(nm\log v\)。
为什么这么 water 的东西还要学整整一天呢?