加载中...

[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)\),瓶颈在于二分.

posted @ 2022-03-22 12:00  ZQYang  阅读(23)  评论(0)    收藏  举报