Uoj#357.【JOI2017春季合宿】Sparklers 题解
题意:
- 简单来说就是$n$个人跑来跑去,保持烟火不灭所需要的最小速度。
- $1\le n\le 10^5,0\le x_i\le 10^9$。
题解:
- 首先可以想到二分答案。
- 然后就是一个判定性问题。
- 我们设$s$为一次传递最多跑的距离。
- 显然每个时刻点燃过烟火的人可以是一段区间。
- 如果$[l,r-1]$或者$[l,r+1]$可行区间非空,那么$[l,r]$时传递给的人的可行区间就是$[x_r-(r-l)\times s,x_l+(r-l)\times s]$。(如果区间不存在就是不可行)
- 可行也就是$x_r-x_l\le 2\times (r-l)\times s$。
- 设$a_i=x_i-2\times i\times s$,那么$a_r\le a_l$,将每个人抽象为$(i,a_i)$。
- 那么就是要求一种从$(K,K)$变换到$(1,n)$的方案,使得每一时刻都有左边点在右边上方。
- 可以分情况讨论一下:
- 如果有一种只往左走的方法可以使左侧变高,走过去显然不会比现在差。(右侧同理)
- 如果两边都不存在变高的方法,那么设当前左侧为$l$,设$l$左侧最低的点为$x$,$x$左侧(包含$x$)最高的点为$y$,那么如果从$l$走到$x$,必然连续地走到$y$。右侧同理。
- 这时我们发现在这种情况下,左边不可能变高,右边不可能变低。
- 所以在两侧都可行的情况下,选择顺序是对结果没有影响的。
- 区间最大最小都可以通过$\rm ST$表实现。
- 复杂度$O(n\log n\log Ans)$。
代码:
1 |
|