一:基本思路
sort(segs.begin(), segs.end())根据segs的第一个数进行排序。
区间根据左边界排好序以后,分下面图的三种情况,本质就是两种情况。
#include <iostream>#include <vector>#include <algorithm>using namespace std;int n;typedef pair<int, int> PII; //临时存储区间vector<PII> res, segs;void merge(vector<PII> &segs) { //避免拷贝构造函数的执行,占用性能sort(segs.begin(), segs.end()); //sort执行的时候根据左边界执行int st = -2e9;int ed = -2e9;for (auto seg : segs) {if (ed < seg.first) { // 图中第三种情况if (ed != -2e9) res.push_back({st, ed}); //if的存在是避免初试的st和ed被加入到res中st = seg.first;ed = seg.second;} else {ed = max(ed, seg.second);}}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);cout << segs.size() << endl;return 0;}
