跳转至

语言月赛 202410 校门外的施工

题目分析

  • 有 $m$ 棵树和 $m-1$ 片草坪,排列为:树 $1$,草坪 $1$,树 $2$,草坪 $2$,$\ldots$,树$m$;
  • 两种施工操作破坏区间内的绿化:
    • 类型 $1$:破坏第 $l$ 棵树和第 $r$ 棵树之间(不含 $l,r$)的所有绿化,即破坏树 $(l+1)$ 到 $(r-1)$ 和草坪 $l$ 到 $r-1$;
    • 类型 $2$:破坏第 $l$ 棵树和第 $r$ 棵树之间(包含 $l,r$)的所有绿化,即破坏树 $l$ 到 $r$ 和草坪 $l$ 到 $r-1$;
  • 施工后统计剩余未被破坏的树和草坪数量。

解题思路

  • 维护两个数组:
    • tree[1,.., m] 标记每棵树是否被破坏(0 表示存活,1 表示被破坏);
    • grass[1,.., m - 1] 标记每片草坪是否被破坏;
    • 两个数组初始化均设为全局变量即可。
  • 对每次施工,根据类型更新 treegrass 的状态;
  • 最后分别统计两个数字里 0 的个数即为剩余的树和草坪数。

实现步骤

  • 初始化 treegrass 数组,全部标记为 0
  • 遍历每次施工:
    • 若类型为 $1$:
      • 对树:标记 tree[l + 1, .., r - 1]1(若区间非空);
      • 对草坪:标记 grass[l, .. ,r - 1]1
    • 若类型为 $2$:
      • 对树:标记 tree[l, .., r]1
      • 对草坪:标记 grass[l, .., r - 1]1
  • 统计 tree0 的数量为剩余树数,统计 grass0 的数量为剩余草坪数;
  • 输出两个结果。

复杂度分析

  • 每次施工最多修改 $O(m)$ 个元素,最多 $n$ 次操作;
  • 时间复杂度为 $O(m \times n)$,对于 $m,n \leq 5000$ 可接受;
  • 空间复杂度为 $O(m)$。

总结

  • 题目考察区间标记和状态维护;
  • 注意边界处理和区间是否包含端点的区别;
  • 通过简单数组标记和统计实现,代码逻辑直观。