下笔春蚕食叶声。

题解 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.要去重。

posted @ 2020-10-27 08:27  ACwisher  阅读(87)  评论(0编辑  收藏  举报