【做题记录】CF521D Shop
-
\(\text{CF521D Shop}\)
- 算法:贪心
题目:
一个长度为 \(k\) 的正整数序列 \(a\)。
有 \(n\) 个操作,每个操作给定正整数 \(op, i, val\),三种类型:
-
\(op=1\),将 \(a_i\) 赋值为 \(val\);
-
\(op=2\),将 \(a_i\) 加上 \(val\);
-
\(op=3\),将 \(a_i\) 乘以 \(val\)。
你可以从 \(n\) 个操作中选择最多 \(m\) 个操作,并按照一定顺序执行。
最大化 \(\displaystyle\prod_{i=1}^k a_i\) 的值。
\(k,n \le 10^5\)。
题解:
首先乘法运算是简单的,因为求 \(\prod\),而乘法与顺序、位置无关。所以考虑加法、赋值。
赋值显然是可以看成一种加法。
那么考虑转化加法。
显然存在最优方案:先赋值再加法再乘法。
假设不存在赋值操作, 那么每个位置的执行的加法必然是 \(val\) 最大的几个。那么按 \(val\) 排序,得到的 \(val\) 将是有序的。那么每个加法执行位置有序。
令当前加法的前一个加法加 \(y\),后一个加法加上 \(x\),那么当前加法就等同于乘上 \(\dfrac{x}{y}\)。
那么赋值就可以转化为加法后再转为乘法。注意加法是对赋值有影响,所以不能直接转换。
时间复杂度 \(O(n\log n)\)。

浙公网安备 33010602011771号