8.26 贪心,DP?
后面的黑题以后再补。
[POKATT 2024] 联合猫国
对于序列中相邻且相同的两个数,设其均为 \(x\),则可以把它们合成为一个 \(x+1\),给定一个序列 \(a\),求在最优操作方式下,合并后最少剩下的数的数量。
\(n \le 10^6, 0 \le k_i \le 10^9\)。
首先一个策略一定是错的:按权值从小到大遍历,能合成的尽量合成。这样做无法预知后面的可能更优的合成方向。
例如:6 5 4 3 2 2 2,首先合成右边那么后面就一点都合成不了。但是合成左边则就可以只剩下 \(2\) 个点。
观察到当一个序列可以合并成一个数时,我们就没有这么多贪心选择了。每次对于每个连续段能合并就合并一定不劣。跑一个区间 DP 查看一下可合并的区间,发现个数是很少的。考虑构造一个上界:如果所有数全部相同,则区间个数也不超过 \(\mathcal O(n \log n)\)。
好现在我们从左往右扫 \(i\),顺手维护一下以 \(i\) 为左端点的可合并的区间。设 \(f_{i,j}\) 表示,当 \(a_i+j\) 为最右边的数时,能合并到哪一个左端点。由于可合并区间总数不超过 \(n \log n\),所以可以直接开动态的 vector 维护之。

浙公网安备 33010602011771号