2021NOI 省选训练赛day2T1 A. 黑白沙漠
2021NOI 省选训练赛day2T1 A. 黑白沙漠
Problem
在一条长度有限的数轴 \([L,R]\) 上,有 \(N\) 栋建筑物。其中第 \(i\) 栋建筑物的坐标为 \(x_i\) ,能够在风中坚持 \(y_i\) 个单位时间。
初始时区间 \([L,R]\) 是无风的,之后无风的区间在每个单位时间内会缩小1单位长度,直至缩小成了一个在 \([L,R]\) 中等概率生成的实数点 \(M\) 处。无风的区间端点位置是关于时间线性的,即在任意时刻, \(\frac{M-L}{R-M}\) 不变。
求对于每一个建筑物最后一个倒下的概率 \(p_i\)。
精度要求: \(eps\le 10^{-9}\) .
\(1\le N\le2\times10^5,-10^6\le L <x_i<R\le 10^6,0\le y_i \le10^6\).
保证 \(x_i\) 互不相同,且对于 \(1\le i<N\) 均有 \(x_i<x_{i+1}\).
Solution
先不考虑随机点 \(M\) 。假如已经确定了点 \(M\) ,如何找到存活到最后的建筑物?
如果建筑物 \(i\) 在无风区中度过了 \(b_i\) 个单位时间,那么倒塌时间为 \(b_i+y_i\) 。这个值最大的建筑物就是答案。当无风区随着时间收缩时, \(b_i\) 可以用折线 \((L,0),(M,R-L),(R,0)\) 来表示。则\(x_i\)处的折线高度即为 \(b_i\) 。(当然也可以用代数计算得出,无伤大雅)
接着,分别考虑 \(M\) 左右两侧的 \(b_i+y_i\) 的最大值。
当 \(M\) 从左到右移动时,考虑 \(M\) 左侧的 \(b_i+y_i\) 的最大值,可以发现对于左侧的两个建筑 \(i,j(x_i<x_j<M)\) ,一旦 \(b_i+y_i>b_j+y_j\) ,则 \(i\) 将永远优于 \(j\) , \(j\) 就永远不会成为答案,直接将 \(j\) 删去即可;从右向左移动时同理。这样我们就将 \([L,R]\) 分为了 \(O(n)\) 个区间,当 \(M\) 在每个区间中,其左右两侧的 \(b_i+y_i\) 的最大值均不变。
那么我们只要分别处理每个区间即可。可以用二分(\(O(\log n)\))或解二次方程(\(O(1)\))的方式找到最大值在左/右的分界点。
实数的二分可以考虑直接设定二分次数,以免因为进度问题死循环。