思路

对于长度为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;
}