插入横坐标与直线斜率均单调
凸包中任意一个点与其两侧的点形成的斜率均单调,并且单调性恰好相反。
假设 (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 分治。