第一个数据范围 L(1 <= L <= 10000)和 M(1 <= M <= 100)
//简单模拟即可 有树为1,无树为0,最后遍历统计1的个数
代码如下:

#include<stdio.h>//模拟 
#include<string.h>
int a[10005];
int main()
{
    int l,m,ans=0;
    scanf("%d %d",&l,&m);
    for(int i=0;i<=l;i++)  a[i]=1;
    while(m--)
    {
        int b,c;
        scanf("%d %d",&b,&c);
        for(int j=b;j<=c;j++)   a[j]--;//变量与数组重名,会编译错误 
    }
    for(int x=0;x<=l;x++)
    {
        if(a[x]==1)   ans++;
    }
    printf("%d\n",ans);
    return 0;
}

第二个数据范围 L(1 <= L <= 100000)和 M(1 <= M <= 100000)
//先差分,再前缀和,最后统计即可
适用于数据数据量大的情况!!!!!!!!!!!!!!!!!!!
下面说一些我初学踩过的一些坑

  1. 差分区间端点的+1,-1本质是+k,-k(差分差分,肯定是之间的差呀),不能直接赋+1或-1;

  2. 求前缀和一定要将最前面的数赋初值,比如sum[0]=data[0];
    代码如下:

    #include<stdio.h>//差分+前缀和
    #include<string.h>
    int sum[10005];
    int data[10005];
    int main()
    {
      int l,m,ans=0;
      scanf("%d %d",&l,&m);
      memset(data,0,sizeof(data));
      while(m--)
      {
          int b,c;
          scanf("%d %d",&b,&c);
          data[b]+=1;//不断差分    +-k
          data[c+1]-=1;  //直接赋值只能通过%50 
      }
    
      sum[0]=data[0];//差分+前缀和求出原数列
      for(int k=1;k<=l;k++) sum[k]=data[k]+sum[k-1]; 
      for(int x=0;x<=l;x++)
      {
          if(sum[x]==0)   ans++;//0,1只是一个数,代表的是状态  有树的状态为0 sum[0]!!! 
      //    printf("%d ",a[x]);
      }
      printf("%d\n",ans);
    //    for(int j=0;j<l;j++)  printf(" %d ",sum[j]);
    //    printf("\n");
      return 0;
    }

    第三个数据范围 L(1 <= L <= 10^9)和 M(1 <= M <= 100000)
    //离散化,鸽了
    因为我是小白,想先去多学学基础知识,离散化暂时鸽了,等有一定基础了再来
    谢谢观看,小白一枚,如果我有错误或您有更好的方法请评论!!!