我的AC代码(模拟+数组遍历)(O(ML))
思路是用一个数组记录树是否存在,遍历所有铁轨,将铁轨所在区域的树标记为1,最后统计记录为0的数量
#include<iostream>
#include<algorithm>
using namespace std;
const int M = 110,N = 10010;
int l,m;
int b[M],e[M],arr[N]; ///arr表示树,0代表有,1代表无
int main(){
int cnt=0;
cin>>l>>m;
for(int i=0;i<m;++i)
cin>>b[i]>>e[i];
for(int i=0;i<m;++i)
for(int j=b[i];j<=e[i];++j)
arr[j]=1;
for(int i=0;i<=l;++i)
if(arr[i]==0)
++cnt;
cout<<cnt<<endl;
return 0;
}
区间合并的方法(O(MlogM))
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int l,m;
pair<int,int> arr[N]; ///存放铁轨
int main(){
int res=0,st=0,ed=-1;
cin>>l>>m;
for(int i=0;i<m;++i)
cin>>arr[i].first>>arr[i].second;
sort(arr,arr+m); ///铁轨按左端点升序排序
for(int i=0;i<m;++i){
if(arr[i].first>ed){ ///没有重叠的区间加入结果
res+=ed-st+1;
st=arr[i].first;
ed=arr[i].second;
}
else{ ///区间合并
ed=max(arr[i].second,ed);
}
}
res+=ed-st+1; ///把最后一段加进来
cout<<l-res+1<<endl; ///输出答案是剩下的树的数量
return 0;
}
处理技巧:使用pair结构
区间合并的步骤:1.将区间按左端点排序
2.如果当前区间左端点大于扫描的区间端点,将扫描的区间并入结果
否则更新扫描的区间的右端点