校门外的树
https://www.luogu.org/problemnew/show/P1047
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int l,m,ans=0; int a[10005]; int main() { cin>>l>>m; for(int i=0;i<=l;++i)a[i]=1; for(int i=0;i<=m;++i) { int ft,st; scanf("%d%d",&ft,&st); for(int j=ft;j<=st;++j)a[j]=0; } for(int i=0;i<=l;++i) { if(a[i])ans++; } cout<<ans; puts(""); return 0; }
差分学习
tree记录每个人砍树的开头和结尾
cut记录一棵树被多少人砍
其他的应该都看得懂
思路大概是这样的: 把不同次数的砍树看做不同的人砍树
第一步:输入,并记录每次砍树的开头和结尾
第二步:扫描,同时更新cut
如果cut==0,那么说明这棵树没有被(残暴的人类)砍伐 否则,则有人砍这棵树,这棵树活不下来
由于这里把区间计算变成了端点的计算,所以是差分法
差分法利用范围比较广,只要可以把区间计算变成端点计算,都可以用差分法,而且时间复杂度一般比较小,实用性强