区间合并--算法基础课

108 阅读1分钟

模板

// 将所有存在交集的区间合并
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;
    swap(res, segs);
}

例题

www.acwing.com/problem/con…

给定 nn 个区间 [li,ri][l_i, r_i],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3][1,3][2,6][2,6] 可以合并为一个区间 [1,6][1,6]

输入格式

第一行包含整数 nn

接下来 nn 行,每行包含两个整数 llrr

输出格式

共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

1n1000001 \le n \le 100000,
109liri109-10^9 \le l_i \le r_i \le 10^9

输入样例:

5
1 2
2 4
5 6
7 8
7 9

输出样例:

3

题解

#include <bits/stdc++.h>
using namespace std;
int n;
typedef pair<int,int> PII;
vector<PII> v;


void merge(vector<PII> &segs){
	vector<PII> res;
	sort(segs.begin(),segs.end());
	int st=INT_MIN,ed=INT_MIN;
	for(auto s:segs){
		if(ed<s.first){
			if(st!=INT_MIN) res.push_back(s);
			st=s.first,ed=s.second;
		}else ed=max(ed,s.second);
	}
	if(st!=INT_MIN) res.push_back({st,ed});
	swap(res,segs);
}

int main(){
	cin>>n;
	while(n--){
		int l,r;
		cin>>l>>r;
		v.push_back({l,r});
	}
	merge(v);
	cout<<v.size();
	

	return 0;
}