原题链接:
题解:
简单来讲就是先对区间左端点进行排序,然后开始逐渐处理,会遇到如下3种情况。
代码:
#include<bits/stdc++.h>
using namespace std;
using PII = pair<int, int>;
const int N = 1e5 + 10;
vector<PII> q;
const int M = -2e9;//定义一个取不到的起始区间端点
void merge(vector<PII>& a) {
vector<PII> b;
sort(a.begin(), a.end());
int st = M, ed = M;
for (auto [l, r] : a) {
if (ed < l) {//两个区间不相交
if (st != M) b.push_back({ st,ed });
st = l, ed = r;
}
else//可能是包含或者相交
ed = max(ed, r);
}
if (st != M) b.push_back({ st,ed });
a = b;
}
int main() {
int n;cin >> n;
for (int i = 0;i < n;i++) {
int l, r;cin >> l >> r;
q.push_back({ l,r });
}
merge(q);
cout << q.size() << endl;
}