《区间合并》

82 阅读1分钟
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef pair<int, int> PII;//pair进行简化
vector<PII> segs(N);
void merge(vector<PII> &segs) {
    vector<PII> res;//定义答案vector
    int cnt = 0;//记录两区间有交集的次数
    sort(segs.begin(), segs.end());//依据pair的左端点进行排序
    int st = -2e9, ed = -2e9;//构造并维护一个不在数据范围内的区间
    for (auto seg : segs) {
        if (ed < seg.first) {//如果维护区间的右端点小于第k个区间的左端点,即两个区间没有交集
            if (ed != -2e9) {//如果维护区间的左端点不等于构造维护区间不在数据范围内的左端点,即左端点已更新
                res.push_back({st, ed});//将此段区间加入到答案vector中
            }
            st = seg.first, ed = seg.second;//是维护区间的左端点变成下一个区间的左端点,右端点同理
        }
        else {//如果两个区间有交集
            ed = max(ed, seg.second);//合并两个区间,即更新两个区间较大者的右端点
            cnt ++;
        }
    }
    if (cnt == segs.size() - 1) {//如果题设区间全部可以和并,即合并后只有一个区间
        res.push_back({st, ed});//将区间加入答案vetcor中
    }
    segs = res;//将答案vector复制给目标vector
}
int main() {
    int n;
    cin >> n;//读入测试样例的数量
    for (int i = 0; i < n; i ++) {
        int l, r;
        cin >> l >> r;//读入区间的左端点和右端点
        segs.push_back({l, r});//将这个区间加入到目标vector中
    }
    merge(segs);//对区间进行合并
    cout << segs.size() << endl;//输出目标vector的长度,即区间合并后的数量
    return 0;
}