1. 程式人生 > 其它 >[tdog]省選集訓 電梯

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