zoukankan      html  css  js  c++  java
  • wqs二分/带权二分/凸优化 详解

    前置芝士

    基础二分+基础DP

    算法流程

    wqs二分是一个神奇的东西,经常用来把限制条件转化为二分来降低时间复杂度。

    常见类型:在满足A物品强制选择了m个情况下总价值最大

    如果不考虑 选择了m个 这个条件,我们只考虑总价值最大,我们能够得到一个时间复杂度比较优秀的算法。

    现在考虑二分一下A物品的额外代价(可正可负),修改A的代价后重新进行刚才的算法,顺便记录一下价值最大的情况下选择了多少个A。

    然后根据选择了多少个A来调整二分边界。

    最后最优情况是选择k个A时,我们把额外代价删去就是正确代价

    很多时候需要二分到小数,而且需要卡精度, 正确性有的时候还需要多考虑考虑。

    证明

    这个大佬证明的很详细

    当然你也可以看一下我这个(滑稽)

    设g(i)是选i个A的最优总价值,i为横坐标,g(i)为纵坐标作图。

    我们要求的是g(m)

    我们二分的就是直线斜率k(就是额外代价,至于为啥先往下看),如下

    当k合适时,只有被切点为m,直线截距最大,设截距为f(i)

    f(i)=g(i)-ki,如下图

    把ki分配到i个物品上,就相当于给每个物品附加上了k的额外代价

    很容易就能求出f的最大值

    g(i)=f(i)+ki,我们根据f(i)取最大值的时候的i和m的大小调整二分

    练习题

    题单

    P2619 [国家集训队]Tree I挺简单一道题,这道题貌似可以通过一些神奇操作不用二分到小数,但我看不懂证明(跪了)

    P4983 忘情

    一顿操作猛如虎,一化式子二百五,wqs二分+斜率优化DP,不会斜率优化DP的建议先学一下

    P5308 [COCI2019] Quiz

    wqs二分+斜率优化DP

    P4383 [八省联考2018]林克卡特树

  • 相关阅读:
    EasyUI——常见用法总结
    递归算法(转)
    1215整理
    jQuery Ajax 实例 全解析(转)
    EL表达式 (详解)
    JSTL 核心标签库 使用(转)
    JSTL标签用法 详解(转)
    JDBC连接Oracle数据库时出现的ORA-12505错误及解决办法
    java中的基本jdbc中mvc基本示例
    Hibernate的QBC检索方式
  • 原文地址:https://www.cnblogs.com/wljss/p/14974183.html
Copyright © 2011-2022 走看看