[AcWing 803] 区间合并



点击查看代码
#include
#include
#include
using namespace std;

typedef pair PII;
vector segs;
void merge(vector& segs)
{
    vector 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;
}
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++) {
        int l, r;
        scanf("%d %d", &l, &r);
        segs.push_back({l, r});
    }
    merge(segs);
    printf("%d", segs.size());
    return 0;
}

  1. 将区间按照左端点进行排序,如果左端点相同,按右端点排序(sort 对 pai 排序的规则是,先按照第一个成员,再按照第二个成员);
  2. 区间合并的三种情况:
    ① 新区间是原区间的子区间,新区间的右端点小于原区间右端点,这种情况不需要处理;
    ② 新区间和原区间有交集,需要合并,新区间的右端点大于原区间的右端点,需要把原区间右端点更新为新区间右端点;
    ③ 新区间和原区间没有交集,需要把区间更新,新区间左端点大于原区间右端点(这种情况要先判断,再判断①和②),将原区间存到 res 中,将原区间更新为新区间;