第一个数据范围 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本质是+k,-k(差分差分,肯定是之间的差呀),不能直接赋+1或-1;
求前缀和一定要将最前面的数赋初值,比如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)
//离散化,鸽了
因为我是小白,想先去多学学基础知识,离散化暂时鸽了,等有一定基础了再来
谢谢观看,小白一枚,如果我有错误或您有更好的方法请评论!!!