1. 程式人生 > 其它 >Educational Codeforces Round 123 (Rated for Div. 2)思路分享

Educational Codeforces Round 123 (Rated for Div. 2)思路分享

Educational Codeforces Round 123 (Rated for Div. 2)

本來這場的狀態不太好,到後面磕不出來的時候有點瞌睡了,到最後竟然沒有記rating....(本來還指望著通過這場掉一波分,這樣就能報下一場的div2了,自我感覺div2現在還沒有到拿捏的程度,E,F就沒有當場做出來的時候....)

A. Doors and Keys

A題算是簽到題吧,只需要判斷鑰匙與門的先後順序即可。

B. Anti-Fibonacci Permutation

B題要求構造一個排列使得他為非斐波那契數列,要求構造出b個排列。
首先想到的就是倒序,之後發現我們將1依次向左移即可。
即:
4 3 2 1.
4 3 1 2
4 1 3 2
1 4 3 2
因為除了1之外,其他的元素都是倒序,註定符合\(a_i+a_{i+1}>a_{i+2}\)

C. Increase Subarray Sums

我承認我被這個題卡了許久,將近50分鐘左右....
由於n是5000的緣故,所以我們完全可以列舉所有的區間去統計答案。可以發現對於某個\(f(k)\)而言,它的答案只可能由以下部分組成:
1.什麼都不選,即答案為0.
2.選取區間長度恰好為k的區間,並將這個區間內的每個數都加上x。
3.選取區間長度小於k的區間,並將這個區間內的每個數都加上x。
4.選取區間長度大於k的區間,並將這個區間內的和增加kx.
第一部分不用考慮,我們只需要在最後的時候和0比大小即可。第二部分考慮我們列舉所有的區間的時候就可以辦到了。第三部分其實就是f(0),f(1),f(2),...,f(k-1)取最大值,其實也好維護。
接下來就是第4部分了。我們令g(k)表示區間長度為k的區間的最大值。那麼第四部分也好考慮就是max(g(k+1),g(k+2),...,g(n))+k

x;
在我們列舉所有區間的時候後一方面維護第二部分的值,一方面維護g的即可。
但其實我們發現不用這麼麻煩,我們完全可以正著做一次,倒著做一次dp即可。正著的不多解釋,關於倒著的,考慮如果x的對應的最優區間長度為y的話,則x+1對應的長度也為y。因為sum(y)+kx>sum(z)+kx(z為x+1對應的最優區間長度).則對於f(x+1)的時候,顯然存在sum(y)+(k+1)x>sum(z)+(k+1)x.我們完全可以只從x+1出轉移即可。