区间合并
思路:
用pair将每个区间输到vector中,再用sort排序,排序完遍历时只用考虑右端点。
代码模板:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII; //自定义PII类型
const int N=1e5+10;
int n;
vector<PII> segs;
void merge(vector<PII> &segs)
{
vector<PII> res;
sort(segs.begin(),segs.end()); //sort默认会先按左边的数排序,然后按右边的数排序
int st=-2e9,ed=-2e9; //-2e9在这里是无穷的意思
for(vector<PII>::iterator it = segs .begin();it != segs.end(); ++it) //遍历
{
if(ed<(*it).first) //如果现在的区间的右端点小于下一个的左端点,即代表没有交集
{
if(st!=-2e9) //当st不是空的时候,没有交集代表是一个新区间
res.push_back({st,ed}); //将合并好的区间放到res中
st=(*it).first; //更新区间左右端点
ed=(*it).second;
}
else
ed=max(ed,(*it).second); //要是有交集,保留较大的右端点
}
if(st!=-2e9) //最后一个区间特判
res.push_back({st,ed});
segs=res;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int l,r;
cin>>l>>r;
segs.push_back({l,r});
}
merge(segs);
cout<<segs.size()<<endl;
return 0;
}