最大值的不同统计方法
题目:CF2154B
题目中有这样一句话:
操作1: 选择一个整数 i 并执行 : 用最大值为 i的前缀替换 $ a_i $ 。
关键区别:“最大值”的计算方式
-
第一段代码(逐步更新最大值):
for (int i = 0, max = 0; i < n; ++ i) { max = std::max(max, a[i]); // 实时更新max为[0..i]区间的最大值 if (i & 1) { a[i] = max; // 奇数索引i的元素被替换为[0..i]的最大值 } }- 最大值的范围:
max是从数组开头到当前索引i的区间内的最大值(即[0, i]范围内的最大值)。 - 替换逻辑:当处理到奇数索引
i时,用截至i为止的最大值替换a[i]。 - 例如:若数组为
[3, 1, 2, 4]:i=0(偶数):max更新为 3([0,0]最大值)。i=1(奇数):a[1]被替换为max=3(此时数组变为[3,3,2,4])。i=2(偶数):max保持 3([0,2]最大值仍为3)。i=3(奇数):max更新为 4([0,3]最大值),a[3]被替换为 4(最终数组[3,3,2,4])。
- 最大值的范围:
-
第二段代码(全局最大值):
int mx_a = 0; for(int i = 0; i < n; i ++) { mx_a = (mx_a <= a[i]) ? a[i] : mx_a; // 计算整个数组的最大值 } for(int i = 0; i < n; i ++) { if(i & 1) { a[i] = mx_a; // 所有奇数索引元素都被替换为全局最大值 } }- 最大值的范围:
mx_a是整个数组的最大值(遍历完所有元素后确定)。 - 替换逻辑:所有奇数索引的元素,无论其位置,都被统一替换为整个数组的全局最大值。
- 例如:同样数组
[3, 1, 2, 4]:- 第一步遍历后,
mx_a为全局最大值 4。 - 第二步遍历:所有奇数索引(
i=1,3)都被替换为 4,最终数组[3,4,2,4]。
- 第一步遍历后,
- 最大值的范围:
总结对比
| 特性 | 第一段代码(逐步更新max) | 第二段代码(全局max) |
|---|---|---|
| 最大值范围 | 截至当前索引 i 的区间最大值 [0, i] |
整个数组的全局最大值 [0, n-1] |
| 奇数索引替换值 | 随位置变化(可能不同奇数索引值不同) | 固定为全局最大值(所有奇数索引值相同) |
| 适用场景 | 需要“动态最大值”(如依赖前缀最大值) | 需要“统一最大值”(所有奇数索引保持一致) |
简言之,两段代码的核心差异在于:奇数索引元素被替换的“最大值”是“前缀动态最大值”还是“全局固定最大值”。
所以,题目所说的“用最大值为i的前缀替换\(a_i\)",就是指第一段代码的逐步更新\(mx_a\)
解决方法也很简单,区别分别就是:先输入完再更新 还是 边输入边更新。

浙公网安备 33010602011771号