社区讨论

斜率优化关于横坐标相等问题

P5785[SDOI2012] 任务安排参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mk2at9jv
此快照首次捕获于
2026/01/06 15:59
上个月
此快照最后确认于
2026/01/09 20:45
上个月
查看原帖
如题,动态规划斜率优化,在主函数单调队列的 while循环用乘法一般这么写(f是纵坐标,c是横坐标):
CPP
while(head < tail && (f[q[tail]] - f[q[tail - 1]]) * (c[i] - c[q[tail]]) >= (f[i] - f[q[tail]]) * (c[q[tail]] - c[q[tail - 1]])) --tail;
用除法也差不多。
但是我想问,如果三点横坐标相等(即 c[i] == c[q[tail]] == c[q[tail - 1]] 怎么办?
感觉这么写是错的,因为如果有三个点横坐标相等,先加入纵坐标最高的点,其次是最低和中间的,按照如上的写法就会造成第一个点和第二个点被弹出,保留纵坐标大小中间的点,但显然保留最低的点更优。
除法的写法就会有除数是0 / 精度无法保证的情况。
萌新实在想不通了,翻古早帖不是图没了就是看不懂。
求助求助求助求助。

回复

2 条回复,欢迎继续交流。

正在加载回复...