深入理解斜率优化

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

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

假设 (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 分治。

原文地址:https://www.cnblogs.com/May-2nd/p/15085106.html