01 分数规划(water)

(nmd 这么水的货我搞了整整一天?我怕不是 sb 吧。)

01 分数规划这东西就是一堆东西每个有两个属性 \(a_i,b_i\),然后要求选出一个集合 \(S\),最小 / 大化 \(\dfrac{\sum\limits_{i\in S}a_i}{\sum\limits_{i\in S}b_i}\)。然后可以搞各种限制,出到各种结构上。

通用的方法是二分答案列出一个不等式,然后把分母乘过去再移过来,然后就好判很多。事实上,二分是一个很有用的东西,尤其是最优化长得很丑的式子,尤其是分式,尤其是分数规划。

prob

P4377 - Talent Show

二分 \(x\),chk 成功当且仅当存在 \(S\) 使 \(\sum\limits_{i\in S}(t_i-xw_i)\geq0\)\(\sum\limits_{i\in S}w_i\geq w\)

考虑贪心地先把所有正的 \(t_i-xw_i\)\(i\) 选出来。如果 \(w\) 已经够了就返回,否则继续考虑负的们。那就是要在 \(xw_i-t_i\) 不过分大的情况下最大化 \(w_i\),这是个背包。但如果把前者作为容量的话,它值域过大,而且是实数。考虑让 \(w_i\) 做容量,求 \(dp_i\) 表示 \(w_i\) 的和恰好为 \(i\) 时的最小的 \(xw_i-t_i\) 和。对 \(w_i\) 一个人就撑满容量的 \(i\),那就判一下是否能选,能选返回,不能选忽略。然后就直接 DP 就好了,\(dp\) 大小要开到 \(2w\),因为会出现超过一点的情况,但再大就不可能了,因为留下来的都是 \(w_i\leq w\) 的,一旦超过两倍那么必然可以删掉一个。复杂度是 \(\mathrm O(nw\log)\)

感觉我的背包写的比较奇怪?可能我对背包这玩意理解的不是太好吧。对了上个 TC 题忘了说了,实数二分也可以直接倍增,就 \(2^{30\sim -30}\) 就好。

P2868 - Sightseeing Cows

首先注意到,对于一个经过一个至少一个点超过一次的环,它的值是按这个点拆开得到的两个环的带权平均减掉一些,肯定不是最优。于是我们只需要找最优比例简单环。

二分 \(x\),令每条边的权值为 \(a_s-xw\),其中 \(s\) 是起点,\(w\) 是原边权。那么显然判有没有非负的大小 \(\geq2\) 的环即可。注意到正和非负是等价的,因为是在实数域上,并且可以轻松避开单点的情况。那就 SPFA \(\mathrm O(nm)\),总 \(\mathrm O(nm\log)\)

P3199 - 最小圈

看题面花里胡哨的符号还以为是啥呢。跟上一题基本一样,只不过改成最小化,然后边权设 \(w-x\),跑负环。

但这题数据范围非常卡,普通的 SPFA 只能 50pts,加了 sb 玄学优化 A 掉了。具体是什么优化就不说了(

P3705 - 新生舞会

二分 \(x\),令边权为 \(a_{i,j}-xb_{i,j}\),然后跑最优匹配,看看是否有 \(\geq0\) 的匹配即可。

poj2976 - Dropping tests

这个就是最简单的题目了……就二分 \(x\),然后把 \(a_i-xb_i\) 从大到小排序取前 \(n-m\) 的和看是否非负即可。

btw,poj 我恨你,%lf 不给过 %f 给过什么 sb 毛病。

P4322 - 最佳团体

JSOI 的题!

考虑二分 \(x\),那么就是看是否有包含 \(0\) 的大小为 \(m+1\) 的连通块的 \(p-xs\) 和为正。

这个有一个很自然的 DP:\(dp_{i,j}\) 表示子树 \(i\) 内选 \(j\) 个的最大和。然后对于每个点扫描一下儿子,对每个儿子用类似卷积和背包的方式更新一下 DP 数组。这玩意被某沙雕称为「树的卷积」,和 SAO 那题一样,复杂度是平方的。

去年某天晚上绞劲脑汁,最终终于归纳证出来了这玩意的复杂度。现在一看,这 tm 不随便证?第二眼,哦,假了。只是不知道为啥所有人 & 题解都认为这个平方复杂度非常自然?希望神仙们在评论区解释一下。

那么总复杂度就是平方对数。

poj2728 - Desert King

poj 我永远问候你全家。


最优比例生成树。

二分 \(x\),那么显然就是判断是否有以 \(cst_{i,j}-x\cdot dis_{i,j}\) 为边权的负权生成树。那么求最小生成树就可以了。

这张图是个完全图,所以 Prim 比 Kruskal 快,是平方的,总的就是平方对数。要控制好常数,一不小心就会 T。

P3288 - 方伯伯运椰子

又是一个 fbb/cy,fbb 我尊敬你(真的尊敬)。

首先考虑二分答案 \(x\),得到 \(X-Y-xk>0\)。不妨把调整的集合看成一个新的可行流叠加进原来的流。显然对原来的每条边,体现到网络流里是,反着流就是压缩,有对应的上限,而正着流就是扩容,无上限,对应的费用显然很好计算。特殊地,与源连的那条边不能调整。然后 \(-xk\) 这东西恰好也可以搞到费用上去,就给每条边增加个 \(-x\) 的费用,表示调整单位流量需要 \(-x\) 的费用。

然后就应该跑最小费用可行流,看是否 \(>0\),就是是否有能让收益增加的可行流(调整方案)。这显然是极有可能有负环的,我还要处理负环然后跑上下界费用流这么麻烦吗?别忘了我们只需要判断是否存在费用为正的可行流,那么显然等价于图中是否有正环,因为流量一定为 \(0\)。于是 SPFA 跑一下即可。

posted @ 2021-02-02 14:42  ycx060617  阅读(140)  评论(0编辑  收藏  举报