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}
\]
把这个转移方程变一下
\[\begin{aligned}
f_{i} & = \max \{ f_{j} - j \} + i & (s_i > s_j) \\
f_{i} & = \max \{ f_{j} \} & (s_i = s_j) \\
f_{i} & = \max \{ f_{j} + j \} - i & (s_i < s_j)
\end{aligned}
\]
然后发现我们只需要对 \(s_i\) 离散化然后把其当作线段树的下标,然后用两个线段树维护一个 \(\max \{f_j - j\}\) 和 \(\max \{ f_j + j \}\) 就好了,转移的时候直接区间查。
中间那一项因为是单点修改单点查询所以可以只用数组。
总复杂度 \(\mathcal O(n \log n)\)。