题目
思路
对于长度为L的马路,一开始共有L+1棵树
如果直接声明长度为L+1的数组再根据输入的区间一个一个遍历把树移走的话,一个区间有n个数就要执行n次操作,太过复杂,耗费时间比较长,数据小还可以操作,数据大的话就不行了,所以这题可以考虑差分和前缀和
有L+1棵树,为了方便操作,在数组最前面和最后面再加两个数,所以这里声明L+3长度的数组。
数组的每个元素代表数轴上这个点比上一个点多了多少棵树,数组第一个元素为1,即一开始所有点上都有树。
只需要把区间左端点处的树自减,右端点后一个点处的树自增即可。后面输出的时候从数组的第一个元素一直遍历到倒数第二个元素,用num计算当前点树的个数,如果num为正数就让sum+1,否则sum保持不变
代码
#include<iostream>
using namespace std;
int main() {
int L, M;
cin >> L >> M;
//数组的每个元素表示该点比上一个点多几颗树
//从数组第二个元素开始为数轴上下标为0的点
int trees[L + 3];
//对数组初始化
trees[0] = 1;
for (int i = 1; i < L + 3; ++i) {
trees[i] = 0;
}
for (int i = 0; i < M; ++i) {
int temp;
cin >> temp;
//从这里开始每个点砍掉一棵树
trees[temp + 1]--;
cin >> temp;
trees[temp + 2]++;
}
int num = 1;
int sum = 0;
for (int i = 1; i < L + 2; ++i) {
num += trees[i];
sum += num > 0 ? 1 : 0;
}
cout << sum;
}