0
点赞
收藏
分享

微信扫一扫

ACWing算法基础课学习笔记 9.区间合并

kmoon_b426 2022-02-21 阅读 65

区间合并的含义是指:
给定若干个区间,如果某两个区间含有交集的话,
那么将这两个区间进行并集(合并),最终求合并后有多少个区间。
注:通常来说,只有端点相接的两个区间也算含有交集
例:

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;
}
举报

相关推荐

0 条评论