区间合并的含义是指:
给定若干个区间,如果某两个区间含有交集的话,
那么将这两个区间进行并集(合并),最终求合并后有多少个区间。
注:通常来说,只有端点相接的两个区间也算含有交集
例:
1 2 3 4 5 6 7 8 9
|_|
| |___|
| | | |_|
| | | | | |_|
| | | | | |_|_|
|_____| |_| |___|
合并后区间,共有三个
方法
1
1
1.按区间左端点排序
2
2
2.扫描整个区间,将所有可能有交集的区间进行合并
具体:
假设已经扫描了第
i
i
i个区间,那么会有以下三种关系
|________________|
l1 r1
1. |_______| 在里面
l2 r2 合并后L=l1,R=r1
2. |_______________| 有一部分交集
l2 r2 合并后L=l1,R=r2
3. |_________| 无交集
l2 r2 不会合并
实际应用:
A
C
W
i
n
g
ACWing
ACWing
803.
803.
803.区间合并
模拟样例:
1 2 3 4 5 6 7 8 9
1 |_|
2 | |___|
3 | | | |_|
4 | | | | | |_|
5 | | | | | |_|_|
首先,维护区间 1 1 1,区间 1 1 1和区间 2 2 2出现了情况 2 2 2,所以两个区间合并为一个区间
|_____|
然后,区间 3 3 3和区间 1 1 1 ~ 2 2 2为情况三,由于所有左端点已经被排序了,所以区间 1 1 1 ~ 2 2 2不会与其他区间产生交集,所以,将区间 1 1 1 ~ 2 2 2加入至答案中。
|_____| |_|
|
|
<-----
此时,维护区间 3 3 3,区间 4 4 4和区间 3 3 3为情况三,同上一步,所以区间 3 3 3也不会与其他区间产生交集,所以将区间 3 3 3加入至答案中。
|_____| |_| |_|
| |
| |
<----- |
<-----------
然后,维护区间 4 4 4,区间 4 4 4和区间 5 5 5为情况 2 2 2,所以两个区间合并为一个区间,由于后面没有区间了,所以将区间 4 4 4 ~ 5 5 5也加入至答案中。
|_____| |_| |___|
| | |
| | |
<----- | |
<----------- |
<----------------
最终,合并后有
3
3
3个没有任何交集的区间,输出
3
3
3
代码:
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N = 100010;
int n;
vector<PII> segs;
const int INF=2e9;
void merge(vector<PII> &segs){
vector<PII> res;
sort(segs.begin(),segs.end());
int st=-INF,ed=-INF;
for(auto seg:segs){
if(ed<seg.x){
if(st!=-INF) res.push_back({st,ed});
st=seg.x,ed=seg.y;
}else{
ed=max(ed,seg.y);
}
}
if(st!=-INF) 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;
}