区间合并
题目
给定 n 个区间 [li,ri]要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3]和 [2,6]可以合并为一个区间 [1,6]。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含两个整数 l 和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1 ≤ n ≤ 100000
−109≤ li ≤ ri≤109输入样例:
5 1 2 2 4 5 6 7 8 7 9
输出样例:
3
代码
#include <iostream> #include <algorithm> #include <vector> using namespace std; typedef pair<int, int> PII; const int N = 100010; int n; vector<PII> segs; void merge(vector<PII> &segs) { vector<PII> res; //存的是区间合并后的结果 sort(segs.begin(), segs.end()); //排序,pair排序优先以左端点排序,然后再以右端点排序 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); //此时有交集,需要把右端点,更新成较长的那个值 //cout << ed << seg.second <<endl; } 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); //进行区间合并 // for (auto ses : segs) // { // cout << ses.first << ses.second << endl; // } cout << segs.size() << endl; return 0; }