【做题记录】CF521D Shop

  • \(\text{CF521D Shop}\)

    • 算法:贪心

题目:

一个长度为 \(k\) 的正整数序列 \(a\)

\(n\) 个操作,每个操作给定正整数 \(op, i, val\),三种类型:

  1. \(op=1\),将 \(a_i\) 赋值为 \(val\)

  2. \(op=2\),将 \(a_i\) 加上 \(val\)

  3. \(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)\)

posted @ 2022-01-17 21:09  trsins  阅读(39)  评论(0)    收藏  举报