• 深入理解斜率优化


    插入横坐标与直线斜率均单调

    凸包中任意一个点与其两侧的点形成的斜率均单调,并且单调性恰好相反。

    假设 (j<k),从 (j) 转移过来优于从 (k) 转移过来。

    [frac{f_k-f_j+a_k-a_j}{b_k-b_j}<c_i ]

    • 符号为小于号,(c) 单调不增,对 ((b,f+a)) 维护上凸包。

    [frac{f_k-f_j+a_k-a_j}{b_k-b_j}>c_i ]

    • 符号为大于号,(c) 单调不减,对 ((b,f+a)) 维护下凸包。

    [frac{f_k-f_j+a_k-a_j}{b_j-b_k}>-c_i ]

    • 符号为小于号,(c) 单调不减,两边各添负号,符号变为大于号,对 ((-b,f+a)) 维护下凸包。

    [frac{f_k-f_j+a_k-a_j}{b_j-b_k}<-c_i ]

    • 符号为大于号,(c) 单调不增,两边各添负号,符号变为小于号,对 ((-b,f+a)) 维护上凸包。

    这样就完成了上凸包对应单调不增和小于号,下凸包对应单调不减和大于号的形式上的统一,每次队首不可能再作为最优了就弹队首,队尾不可能成为最优就弹队尾。

    可以理解成每次拿一根直线来切,切到的点作为当前最优决策点。

    蓝色方框中是再也不会被切到的点。

    黄色方框中是没有任何机会被切到的点:如果直线斜率大于它与前一个点之间的斜率那么前一个点更优;否则它与后一个点之间的斜率大于直线斜率从而后一个点更优。

    插入横坐标单调直线斜率不单调

    维护上凸包还是下凸包要看符号,当然和上面一样。

    接着二分被切到的点即可。

    插入横坐标与直线斜率均不单调

    维护上凸包还是下凸包要看符号,当然和上面一样。

    无脑一点用平衡树动态维护凸包,有脑一点就写个 CDQ 分治。

  • 相关阅读:
    Python连接MySQL数据库之pymysql模块使用
    线程
    进程
    网络编程
    面向对象进阶
    迭代器,生成器,装饰器
    函数的基础
    Andy's First Dictionary UVA
    Stripies POJ
    Soldier and Badges CodeForces
  • 原文地址:https://www.cnblogs.com/May-2nd/p/15085106.html
Copyright © 2020-2023  润新知