zoukankan      html  css  js  c++  java
  • 01 分数规划(water)

    (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 跑一下即可。

    珍爱生命,远离抄袭!
  • 相关阅读:
    @Aspect 注解使用详解
    Mysql的4个隔离级别
    【学习笔记】二分类问题中的“最大似然”与“交叉熵损失”概念的理解
    【转】对“先验概率”与“后验概率”概念的通俗理解
    nginx——安装部署vue项目
    JWT
    Vue——自定义组件实现vmodel
    Vue——子级向父级传递参数
    SpringBoot2(十四)全局异常切面
    Vue——ElementUI表格分页
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/01fsgh.html
Copyright © 2011-2022 走看看