前言
区间合并这种算法并不是很常用,但是大家也应该掌握
一、区间合并的概念
先以区间的左端点进行排序,然后将每个区间进行和并,共有三种情况:
1:新区间是维护区间的子区间
2:新区间与维护区间有相交部分
3:新区间与维护区间没有相交部分
二、典型例题
例题:
AC代码:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
typedef pair<int ,int>PII;
vector<PII>segs;
void merge(vector<PII>&segs)
{
vector<PII>res;
sort(segs.begin(),segs.end());//排序
int st=-2e9,ed=-2e9;//将第一个元素进行初始化
for(auto seg:segs){
if(ed<seg.first)//说明没有重复区间
{
if(st!=-2e9) res.push_back({st,ed});//直接插入该区间
st=seg.first ,ed = seg.second;//更新区间
}
else ed = max(ed,seg.second);//有重复区间取最大值
}
if(st!=-2e9) res.push_back({st,ed});//说明最后的区间存在继续插入
segs=res;//进行覆盖即为多少个区间了
}
int n,l,r;
int main()
{
int n;
cin>>n;
while(n--){
cin>>l>>r;
segs.push_back({l,r});
}
merge(segs);
cout<<segs.size()<<endl;
return 0;
}