最大值的不同统计方法

题目:CF2154B

2154B

题目中有这样一句话:
操作1: 选择一个整数 i 并执行 : 用最大值为 i的前缀替换 $ a_i $ 。

关键区别:“最大值”的计算方式

  1. 第一段代码(逐步更新最大值)

    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])。
  2. 第二段代码(全局最大值)

    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\)

解决方法也很简单,区别分别就是:先输入完再更新 还是 边输入边更新。

posted @ 2025-10-21 19:16  EcSilvia  阅读(2)  评论(0)    收藏  举报