Codeforces Round #783 (Div. 2) VP 記錄
阿新 • • 發佈:2022-04-21
Codeforces Round #783 (Div. 2) VP 記錄
More And More Vegetable……
A. Direction Change
求從 \((1,1)\) 走到 \((n,m)\) 的最小步數。只能上下左右走,不能出界,不能連續兩次方向相同。
特判一下所有情況就可以了。
貪心的去走,每走兩步橫縱距離都減一。處在同一行(列)時就按照 右下右上 迴圈走就行,根據剩下距離的奇偶性討論一下。
B. Social Distance
\(a_i\) 大的要儘量和大的挨在一起,因為兩個相鄰的 \(i,j\) 之間需要的空位數為 \(\max \{ a_i, a_j\}\)
直接貪心填就是最優的。
C. Make it Increasing
發現 \(n\) 只有 \(5000\),\(a_i\) 只能在 \(b_i\) 的位置相加減,考慮列舉一下 \(0\) 的位置然後向左向右貪心算一下讓其變成遞增序列所需要的最小次數即可,最後對答案取一個 \(\min\)。
D. Optimal Partition
一個顯然的 DP 是,設 \(f_i\) 表示前 \(i\) 個元素的最大價值,\(s_i = \sum_{j=1}^{i} a_j\)。
那麼有轉移方程
\[\begin{aligned} f_{i} & = \max \{ f_{j} + (i-j) \} & (s_i - s_j > 0) \\ f_{i} & = \max \{ f_{j} \} & (s_i - s_j = 0) \\ f_{i} & = \max \{ f_{j} + (j-i) \} & (s_i - s_j < 0) \end{aligned} \]把這個轉移方程變一下
然後發現我們只需要對 \(s_i\) 離散化然後把其當作線段樹的下標,然後用兩個線段樹維護一個 \(\max \{f_j - j\}\) 和 \(\max \{ f_j + j \}\)
中間那一項因為是單點修改單點查詢所以可以只用陣列。
總複雜度 \(\mathcal O(n \log n)\)。