题解 CF535E 【Tavas and Pashmaks】
一.转化成n条直线
不难看出,每个人所花费的时间是\(t=\frac S {s_i} +\frac R {r_i}\)
不妨设R=1,则\(t=\frac {\frac S R} {s_i} +\frac 1 {r_i}\)
现在准备一个点\((\frac 1 {s_i},\frac 1 {r_i})\)
则\(t=\frac {\frac S R} {s_i} +\frac 1 {r_i}\)
令\(k=-\frac S R,x=\frac 1 {s_i},y=\frac 1 {r_i}\) \((k<0)\)
∴ \(t=-kx+y\)
∴ \(y=kx+t\)
也就是说,我们拥有了n条直线。
二.答案在左下凸包上
对于每条直线,需要寻找使得t最小的k。
对于一个点A,它的左下方如果有一个点B时,
\(y_A=kx_A+t_A,y_B=kx_B+t_B\)
\(t_A=-kx_A+y_A,t_B=-kx_B+y_B\)
∵\(x_B\le x_A,y_B\le y_A\)
∴\(t_B \le t_A\)
因此答案在左下凸包上。
三.关于左下凸包
可以先排除x和y都比其他的点中某一个小的。
先按照x从小到大排序,x一样按照y从小到大排序。
求左下凸包的时候,每两个凸包上的点k<0并且k逐渐减小。
四.警告
1.宇智波—鼬 的代码,为了不损失精度,x的存储是\(s_i\),y的存储是\(r_i\),不要看着四就搞错了。
2.要去重。
QwQwQ