提供一种O(n+m)的思路。
利用差分数组可以实现O(1)进行一次区间操作,而计算具体某个元素的时间复杂度为O(n)(一次性计算所有元素的值时间复杂度为O(n))。因为本题先进行一系列区间操作,最后再询问一次所有元素的值,因此十分适合用差分数组求解。
对于本题,可将原数组初值设置为0,表示树还在,而后续砍树操作看做区间减1操作,最后再计算修改后的数组的值,当值小于0,说明被砍了,反之还在,统计结果即可。
差分数组
定义
diff[i]=a[i]-a[i-1],i>=1(a为原数组,diff为差分数组)
diff[0]=a[0]
显然,a[i]=diff[0]+...+diff[i]
区间操作
对[l,r]进行加x操作,转化为:
diff[l]+=x
diff[r+1]-=x
// // Created by Zed on 2024/1/27. // #include <iostream> const int MAXN=1e4+10; using namespace std; int diff[MAXN];//差分数组 int main() { int L,M; while(cin>>L>>M){ int l,r; for (int i = 0; i < L+2; ++i) { diff[i]=0;//默认初始值为0 } for (int i = 0; i < M; ++i) { cin>>l>>r; diff[l]--;//对[l,r]区间进行减1操作 diff[r+1]++; } int cur=0; int ans=L+1; for (int i = 0; i < L+1; ++i) { cur+=diff[i];//累加计算第i个元素的值 if(cur<0){//若值小于0,说明编号i的树被砍了 ans--; } } cout<<ans<<endl; } return 0; }