[tdog]省选集训 电梯
电梯
原题链接:传送门
设\(f(i)\)表示第\(i\)个人运送到位后电梯到达\(1\)层的时间,我们很容易可以得到状态转移方程
\[f(i)=\min_{j\in[1,i]}(\max(f(j-1),arr_i)+2\times \max_{k\in[j,i]}pos_k)
\]
根据上述转移方程,我们很容易可以得到一个时间复杂度为\(O(n)\)的DP,得分60pts.
我们考虑怎么优化这个DP.首先很容易发现,如果原序列\(pos_i\)有一段区间\([j,k]\),满足\(\forall s\in[j,k),pos_s \leq pos_{s+1}\),即这段区间是单调不降的,则有\(\forall s\in [j,k], f(s) \leq f(k)\).
下面我们来证明一下这件事情.对于第\(k\)个人,\(f(k)\geq 2\times pos_k+arr_k\),也就是说无论如何,如果我们要将第\(k\)个人送到\(pos_k\)的位置,电梯回到第\(1\)层的时间一定不小于\(2\times pos_k + arr_k\).那么对于\(s\in[j,k)\)这些人,因为我们满足\(pos_s\)单调不降,所以运送\(k\)的时候将这些人一起送,对\(f(k)\)并没有任何影响.
所以我们可以对\(arr_i\)进行筛减,最终使得\(arr_i\)变成一个单调不升的子序列\(x_i\).这个过程的时间复杂度\(O(n)\).这样,我们就可以改变一下我们状态转移方程了.
\[f(i)=\min_{j\in[1,i]}(\max(f(j-1),x_i)+2x_i)
\]
显然\(f(i)\)是单调不降的,所以\(\exist m\in[1,i],s.t.\forall j\leq m, f(j)\leq x_i,\forall j>m, x_i<f(j)\).我们用二分寻找这个阈值\(m\)即可.
时间复杂的\(O(n\log n)\),瓶颈在于二分.

浙公网安备 33010602011771号