跳转至

语言月赛 202411 Rise

题目分析

  • 有一排 $n$ 个花盆,初始高度均为 $0$;
  • 有两种操作:
  • water l r:将花盆 $l$ 到 $r$ 的高度均加 1;
  • rise l r k:对于花盆 $l$ 到 $r$,若花盆高度 $\ge k$,摘下该花(高度变为 0),输出摘下花的数量;
  • 对每个 rise 操作输出摘下花的个数。

解题思路

  • 因为 $n,m \leq 1000$,可直接用数组模拟;
  • 使用一个数组 h 存储每个花盆当前高度;
  • 遍历操作:
  • water:对 $[l,r]$ 区间高度加 1;
  • rise:对 $[l,r]$ 区间判断高度,若 $\ge k$ 则计数并将其置为 0;
  • 每个 rise 操作输出计数。

处理流程

  • 定义数组 int h[1005],所有元素初始设为 $0$,定义全局数组自动实现;
  • 依次读取 $m$ 条操作,执行 while (m--) 即可:
    • 若为 water l r,对 h[l...r] 全部加 1;
      • 即循环遍历 $h_l\sim h_r$ 执行 h[i] ++
    • 若为 rise l r k,遍历 h[l...r],统计高度 $\ge k$ 的数量并置为 $0$,输出数量。
      • 即循环遍历 $h_l\sim h_r$,若 h[i] >= k,令 sum++ 同时重置 h[i] = 0

复杂度分析

  • 每个操作最多更新或遍历 $O(n)$ 个花盆;
  • 总复杂度为 $O(m \times n)$,在 $n,m \leq 1000$ 时可接受。

总结

  • 该问题适合直接模拟,代码简单易实现;
  • 注意数组下标和输入的转换,题目编号从 $1$ 开始;
  • 保证对每个 rise 操作输出正确摘花数量。