
题目思路解析
这道题要求计算移除多个区间内的树木后,马路上剩余的树木数量。关键在于高效处理可能重叠的多个区间,并准确统计被移除的树木。
核心思考路径
我们将马路抽象为从 0 到 l 的连续区间。首先需要标记所有需要移除树木的区间,最后统计未被标记的树木数量。
关键知识点
- 数组标记法:用数组元素表示树木存在状态,将移除区间内的元素设为 true,遍历统计未被标记的元素。
- 区间合并处理:处理多个区间可能重叠的情况,注意包含区间的两个端点,避免重复标记已移除的树木。
- 输入输出处理:正确处理 m 组区间数据,验证 u 和 v 的合法性,按要求格式输出剩余树木数。
C++ 完整实现
解法一:布尔数组标记法
这是最直观的解法,适合数据范围较小的情况。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int l, m;
cin >> l >> m;
vector<bool> trees(l + 1, false); // false 表示树存在
while (m--) {
int u, v;
cin >> u >> v;
for (int i = u; i <= v; ++i) {
trees[i] = true; // true 表示树被移除
}
}
int count = 0;
for (int i = 0; i <= l; ++i) {
if (!trees[i]) ++count;
}
cout << count << endl;
;
}


