(nmd 这么水的货我搞了整整一天?我怕不是 sb 吧。)
01 分数规划这东西就是一堆东西每个有两个属性 (a_i,b_i),然后要求选出一个集合 (S),最小 / 大化 (dfrac{sumlimits_{iin S}a_i}{sumlimits_{iin S}b_i})。然后可以搞各种限制,出到各种结构上。
通用的方法是二分答案列出一个不等式,然后把分母乘过去再移过来,然后就好判很多。事实上,二分是一个很有用的东西,尤其是最优化长得很丑的式子,尤其是分式,尤其是分数规划。
prob
P4377 - Talent Show
二分 (x),chk 成功当且仅当存在 (S) 使 (sumlimits_{iin S}(t_i-xw_i)geq0) 且 (sumlimits_{iin S}w_igeq 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_ileq w) 的,一旦超过两倍那么必然可以删掉一个。复杂度是 (mathrm O(nwlog))。
感觉我的背包写的比较奇怪?可能我对背包这玩意理解的不是太好吧。对了上个 TC 题忘了说了,实数二分也可以直接倍增,就 (2^{30sim -30}) 就好。
P2868 - Sightseeing Cows
首先注意到,对于一个经过一个至少一个点超过一次的环,它的值是按这个点拆开得到的两个环的带权平均减掉一些,肯定不是最优。于是我们只需要找最优比例简单环。
二分 (x),令每条边的权值为 (a_s-xw),其中 (s) 是起点,(w) 是原边权。那么显然判有没有非负的大小 (geq2) 的环即可。注意到正和非负是等价的,因为是在实数域上,并且可以轻松避开单点的情况。那就 SPFA (mathrm O(nm)),总 (mathrm O(nmlog))。
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}-xcdot dis_{i,j}) 为边权的负权生成树。那么求最小生成树就可以了。
这张图是个完全图,所以 Prim 比 Kruskal 快,是平方的,总的就是平方对数。要控制好常数,一不小心就会 T。
P3288 - 方伯伯运椰子
又是一个 fbb/cy,fbb 我尊敬你(真的尊敬)。
首先考虑二分答案 (x),得到 (X-Y-xk>0)。不妨把调整的集合看成一个新的可行流叠加进原来的流。显然对原来的每条边,体现到网络流里是,反着流就是压缩,有对应的上限,而正着流就是扩容,无上限,对应的费用显然很好计算。特殊地,与源连的那条边不能调整。然后 (-xk) 这东西恰好也可以搞到费用上去,就给每条边增加个 (-x) 的费用,表示调整单位流量需要 (-x) 的费用。
然后就应该跑最小费用可行流,看是否 (>0),就是是否有能让收益增加的可行流(调整方案)。这显然是极有可能有负环的,我还要处理负环然后跑上下界费用流这么麻烦吗?别忘了我们只需要判断是否存在费用为正的可行流,那么显然等价于图中是否有正环,因为流量一定为 (0)。于是 SPFA 跑一下即可。