[AcWing 803] 区间合并

image


点击查看代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

typedef pair<int, int> PII;
vector<PII> segs;
void merge(vector<PII>& segs)
{
    vector<PII> 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 中,将原区间更新为新区间;
posted @   wKingYu  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWing 803] 区间合并』
点击右上角即可分享
微信分享提示